Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/18: Рейтинг темы: голосов - 18, средняя оценка - 5.00
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314

Обновление CSV в MySQL

31.03.2017, 09:13. Показов 3713. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане!
У меня есть файлы csv их необходимо загружать в удаленную базу. При этом если такие записи есть то обновлять определенные поля а если нету то добавлять.
Файлов много, записей в общей сложности будет свыше 30000, обновление данных раз в неделю.
вот то что сам сделал:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 For Each File In arrFiles
                Label1.Text = Label1.Text & vbCrLf & "Обработка файла " & IO.Path.GetFileName(File)
                Lines = IO.File.ReadAllLines(File, System.Text.Encoding.Default)
                'Импорт в таблицу USRUSER - хранятся логин пароль и другая информация о потребителе
                If InStr(IO.Path.GetFileName(File), "usrUser") > 0 Then
                    For i = 0 To Lines.Count - 1
                        CountRecord = CountRecord + 1
                        Array = Split(Lines(i), ";")
                        If Array(0) <> "" And Array(0) <> "0" Then
                            cmd.CommandText = "SELECT * from usrusers Where Login= '" & Array(0) & "'"
                            Try
                                reader = cmd.ExecuteReader()
                                If reader.HasRows Then
                                    cmd.CommandText = "UPDATE usrusers SET fio='" & Array(1) & "' ,adres='" & Array(2) &
                                        "',Debt=" & Array(3) & ",`Role`=0,phone='" & Array(4) & "',email='" & Array(5) &
                                        "' WHERE login='" & Array(0) & "'"
                                Else
                                    cmd.CommandText = "INSERT INTO usrusers (login,fio,adres,Debt,phone,email,`Role`) VALUES ('" & Array(0) & "','" &
                                    Array(1) & "','" & Array(2) & "','" & Array(3) & "','" & Array(4) & "','" & Array(5) & "',0)"
                                End If
                                reader.Close()
                                cmd.ExecuteNonQuery()
                            Catch ex As Exception
                            End Try
                        End If
                    Next
                End If
                'Конец импорта в таблицу usrUser
                'Импорт в таблицу usroperation - хранятся начисления и оплата 
                If InStr(IO.Path.GetFileName(File), "usroperation") > 0 Then
                    For i = 0 To Lines.Count - 1
                        Array = Split(Lines(i), ";")
                        IDusr = OpredelenieIDusr(Array(0))
                        Try
                            cmd.CommandText = "SELECT * FROM usroperation Where UserID= '" & IDusr & "' and Data=" & Array(2) & " and VidOplati=" & Array(4)
                            reader = cmd.ExecuteReader()
                            If reader.HasRows Then
                                'cmd.CommandText = "UPDATE usroperation SET Vid='" & Array(1) & "' ,Data='" & Array(2) &
                                '       "',Summa=" & Array(3) & ",`VidOplati`=" & Array(4) & " WHERE login='" & IDusr & "'"
                            Else
                                cmd.CommandText = "INSERT INTO usroperation (UserID,Vid,Data,Summa,VidOplati) VALUES ('" & Array(0) & "','" &
                                    Array(1) & "','" & Array(2) & "','" & Array(3) & "','" & Array(4) & ")"
                            End If
                            reader.Close()
                            cmd.ExecuteNonQuery()
                        Catch ex As Exception
                        End Try
                    Next
                End If
            Next
Это все работает но очень медленно. И я точно знаю что есть метод проще (это всегда так, ибо я тот еще кодер) но найти не смог.
На 4800 записей ушло 20 минут.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2017, 09:13
Ответы с готовыми решениями:

Из csv в mysql
Доброго времени суток ,ув. форумчане! Столкнулся с заданием : Существует цсв-шка группы в которой написаны id,number,department...

Обновление базы данных через CSV файл
Добрый день! Есть некий код, немного рабочий даже. Но вот большие файлы обработать немного сложнее. Если есть мысли у кого, или кто-то...

Из csv в mysql ver.2
Привет всем! Есть задание : перегнать данные из csv в mysql (таблицу студенты и таблицу группы), но меня уже бесит то - что все время...

23
53 / 53 / 17
Регистрация: 12.02.2017
Сообщений: 261
31.03.2017, 10:12
Цитата Сообщение от Бормалей Посмотреть сообщение
При этом если такие записи есть то обновлять определенные поля а если нету то добавлять.
Добавте многопоточность загрузки файлов.
1
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
31.03.2017, 11:15  [ТС]
4800 записей было в одном файле.
Таких файлов будет 12-13. Мне кажется проблема в методе чтения в файле-поиска в базе-обновления записей
0
53 / 53 / 17
Регистрация: 12.02.2017
Сообщений: 261
01.04.2017, 03:29
Цитата Сообщение от Бормалей Посмотреть сообщение
4800 записей было в одном файле.
Таких файлов будет 12-13. Мне кажется проблема в методе чтения в файле-поиска в базе-обновления записей
Метод чтения как раз нормальный, используйте многопоточность чтения и изменения базы данных, добавте больше обрабатывающих циклов, каждый цикл по линии, да и скорость обмена данными через сервер какая? может надо загрузить файл а потом снова загрузить с изменениями.
1
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
01.04.2017, 04:59  [ТС]
Спасибо за направление пойду изучать.
0
Модератор
Эксперт .NET
 Аватар для Yury Komar
4360 / 3430 / 512
Регистрация: 27.01.2014
Сообщений: 6,258
01.04.2017, 17:45
30.000 записей... это не много.
используйте транзакцию, это сильно ускорит процесс добавления/обновления данных в базе.

вот код на примере SQLITE:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
        Dim Query As New SQLite.SQLiteCommand
        Dim MyTransaction As SQLiteTransaction = Connection.BeginTransaction()
        
        Query.Transaction = MyTransaction
 
        For each Record as string in Records() 'массив записей
            Query = New SQLite.SQLiteCommand(String.Format("INSERT OR IGNORE INTO table_name (id, record_data) VALUES(NULL, '{0}')", Record), Connection)
            Query.ExecuteNonQuery()
        Next
 
        MyTransaction.Commit() 'закрываем транзакцию и добавляем данные в базу
2
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
02.04.2017, 08:15
Цитата Сообщение от Yury Komar Посмотреть сообщение
используйте транзакцию
это если тип базы у ТС Inno то да, если MyIsam, там сервер управляет транзакциями, хранит в памяти, а потом пишет
0
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
02.04.2017, 10:45  [ТС]
тип MyIsam. Начал изучать многопоточность и первые же строки от автора "Я боюсь многопоточности в VB .NET"
Может кто то покажет пример многопоточного чтения одного файла?
0
53 / 53 / 17
Регистрация: 12.02.2017
Сообщений: 261
02.04.2017, 11:54
Цитата Сообщение от Бормалей Посмотреть сообщение
тип MyIsam. Начал изучать многопоточность и первые же строки от автора "Я боюсь многопоточности в VB .NET"
Может кто то покажет пример многопоточного чтения одного файла?
Многопоточность чтения это когда целый файл делится на несколько частей обрабатывается потом объединяется.

Цитата Сообщение от Бормалей Посмотреть сообщение
У меня есть файлы csv их необходимо загружать в удаленную базу. При этом если такие записи есть то обновлять определенные поля а если нету то добавлять.
Файлов много, записей в общей сложности будет свыше 30000, обновление данных раз в неделю.
У вас есть программа как Excel и в ней столбцы это база данных сохраняется и загружается? Если да то тогда обновлять базу данных лучше сразу в программе а потом загружать.
1
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
02.04.2017, 13:39
Я бы советовал еще создать индексы на usrusers.login
И во второй части зачем чтение, если будет только добавление в usroperation?
1
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
02.04.2017, 14:04  [ТС]
Navthe, спасибо, да я сейчас займусь изучением этого, просто думал это стандартные операции и должен быть какой то быстрый и четкий алгоритм.
Цитата Сообщение от Navthe Посмотреть сообщение
У вас есть программа как Excel и в ней столбцы это база данных сохраняется и загружается?
Нет у меня есть программа с базой Interbase и мне нужно загружать из нее данные в MySQL для отображения на сайте. А так как к базе на Интербасе мне доступ не дадут, то попросил выгружать в CSV файлах.
Bidgo, для второй части все таблицы будут очищаться и загружаться заново.
0
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
02.04.2017, 15:00
Цитата Сообщение от Бормалей Посмотреть сообщение
мне нужно загружать из нее данные в MySQL для отображения на сайте
Может в таком случае проще будет не перебирать каждую запись, а загрузить usrUser.csv, используя LOAD DATA INFILE в отдельную таблицу csv, после чего одним или двумя запросами проапдейтить таблицу usrUser.
Например,
VB.NET
1
2
3
4
cmd.CommandText = "UPDATE usrusers SET fio=csv.fio, adres=csv.adres, ..... WHERE usrusers.login=csv.login"
cmd.ExecuteNonQuery()
cmd.CommandText = "INSERT INTO usrusers (SELECT * FROM csv WHERE csv.login not in (select login from usrusers))"
cmd.ExecuteNonQuery()
а вторую таблицу, если она все равно очищается перед каждой загрузкой, можно просто загрузить с файла.
1
 Аватар для XIST
1962 / 1072 / 148
Регистрация: 01.10.2009
Сообщений: 3,617
Записей в блоге: 1
02.04.2017, 19:18
Цитата Сообщение от Bidgo Посмотреть сообщение
Может в таком случае проще будет не перебирать каждую запись, а загрузить usrUser.csv, используя LOAD DATA INFILE в отдельную таблицу csv, после чего одним или двумя запросами проапдейтить таблицу usrUser.
Например,
Вы извращенец еще тот
0
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
03.04.2017, 01:03  [ТС]
Bidgo, надо попробовать.XIST, скажите что не так в предложении Bidgo,
0
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
03.04.2017, 07:32  [ТС]
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
  cmd.CommandText = "Load DATA LOCAL INFILE '\tmp" & IO.Path.GetFileName(File) & "' REPLACE INTO TABLE  `usrusersTemp`" &
" FIELDS TERMINATED BY  ';'
                     (
                    `login` , 
                    `fio` ,
                    `adres` ,
                    `Debt` ,
                    `phone` ,
                    `email`
)"
                    Debug.Print(cmd.CommandText)
                    cmd.ExecuteNonQuery()
выводит ошибку. На сервере отрабатывает на отлично.
Миниатюры
Обновление CSV в MySQL  
0
117 / 110 / 31
Регистрация: 05.04.2014
Сообщений: 224
03.04.2017, 07:52
Попробуйте так:
VB.NET
1
cmd.CommandText = "Load DATA LOCAL INFILE '\tmp" & IO.Path.GetFileName(File) & "' REPLACE INTO TABLE  `usrusersTemp` (`login` , `fio` , `adres` , `Debt` , `phone` , `email`) FIELDS TERMINATED BY  ';' ENCLOSED BY '"'"
0
104 / 55 / 7
Регистрация: 02.07.2013
Сообщений: 314
03.04.2017, 09:58  [ТС]
пишет: синтаксическая ошибка в sql запросе.
0
18 / 9 / 4
Регистрация: 04.02.2015
Сообщений: 36
03.04.2017, 11:03
Лучший ответ Сообщение было отмечено Бормалей как решение

Решение

Предлагаю сразу после
VB.NET
1
            If InStr(IO.Path.GetFileName(File), "usrUser") > 0 Then
сделать чтение из базы в DataTable
VB.NET
1
2
3
4
5
                cmd.CommandText = "SELECT * from usrusers"
                Dim reader = cmd.ExecuteReader()
                Dim dt As New DataTable
                dt.Load(reader)
                reader.Close()
и вместо
VB.NET
1
2
3
4
                           cmd.CommandText = "SELECT * from usrusers Where Login= '" & Array(0) & "'"
                            Try
                                reader = cmd.ExecuteReader()
                                If reader.HasRows Then
сделать
VB.NET
1
2
3
                        Try
                            Dim drs = dt.Select("Login='" & array(0) & "'")
                            If drs.Count > 0 Then
Таким образом можно убрать чтение из базы при обработке каждой строки.
2
1741 / 1658 / 167
Регистрация: 25.07.2015
Сообщений: 2,720
03.04.2017, 11:56
Бормалей,сервер правильно пишет об ошибках, в предложенном запросе их на вскидку несколько.
Почитайте внимательно про использование LOAD DATA INFILE
Во-первых , "" - это управляющий символ в MySQL , использовать нужно двойной слэш \\
Во-вторых, если вы используете параметр LOCAL , т.е. предполагается чтения файла с вашей машины, а не с сервера,
то должны быть включены разрешения на его использование на сервере и указывать нужно полный путь к файлу
c:\\tmp\\file.csv примерно. (в зависимости от версии MySQL он может не понимать \\ ,
тогда нужно использовать //
В-третьих , прочитайте строку к файлу в предложенном примере : там нет разделения вообще никакого между
директорией и файлом.
В общем читайте доки по Load Data .
Настройки его достаточно заморочены( но это только в первый раз) , за то это очень мощный загрузчик.
У меня 44 млн записей , разбитые на 6 файлов , загружаются примерно 40 минут , включая индексацию
из которых примерно половину времени занимает индексация.
4800 записей для MySQL вообще "ни о чём" .
Рекомендую грузить файлы последовательно во временные таблицы и все операции сравнения , апдейта и
так далее делать уже между основной таблицей и загруженной временной внутри сервера - это будет
гораааздо быстрее , чем REPLACE-ить при загрузке , т.к. при загрузке каждой строки серверу приходится
читать всю целевую таблицы построчно...
Начиная , если не ошибаюсь, с версии сервера MySql 5.5 , он поддерживает динамическое создание
темповой таблицы , являющейся целевой для загрузки файла,/убивать её после обработки и создавать
заново с тем же именем для загрузки следующего файла - это бывает необходимо , чтобы под каждый файл,
если он имеет разную структуру, не создавать свою временную таблицу.
Если же файлы имеют одну структуру, до достаточно просто очищать временную таблицу тем же "truncate table",
как вариант.

Добавлено через 20 минут
Бормалей, хотя...просмотрел повнимательней ваш исходный код и соглашусь с sur1966.
У вас там почти всё в порядке. Как мне кажется все тормоза загрузки происходят из-за того ,
что вы производите обработку целевой таблицы во время самой загрузки - при каждой новой строке
серверу приходится читать всю целевую таблицу,причём через ADO.NET .
Разделите эти два процесса : сначала считываете файл во временную таблицу на сервер , а потом обновляете
целевую . Силами сервера это (обновление) будет происходить значительно быстрее.
0
18 / 9 / 4
Регистрация: 04.02.2015
Сообщений: 36
03.04.2017, 12:03
Думается мне, что можно ускорить работу, если не выполнять запрос на добавление или изменение на каждой строке исходного файла, а собирать один большой запрос и потом его выполнять (можно завести счетчик и, например, на каждой 100-й строке выполнять, а потом запрос обнулять).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.04.2017, 12:03
Помогаю со студенческими работами здесь

csv 2 MySQL utf8
Добрый день, Уважаемые форумчане! Собственно проблема состоит в следующем: Надо подлить csv файл в таблицу mysql. Кодировка у бд...

Импорт csv в mysql
Добрый день. Можно ли реализовать выгрузку csv файла в БД bitrix'а? Не в инфоблок, а именно в mySQL.

Импорт из CSV в Mysql
Добрый День. Прошу помощи в скрипте не могу понять почему значения из файла 222.csv дублируются, причем в таблице всего 1960 строк, а...

csv в mysql не работает
mysql_query(&quot;LOAD DATA LOCAL INFILE 'price.csv' REPLACE INTO TABLE `price` FIELDS TERMINATED BY ';' ESCAPED BY '\\' LINES STARTING...

csv php mysql
Добрый день, меня интересует такой вопрос. Возможно ли сделать так: при добавление данных из cvs в базу данных, чтобы поля с одинаковыми...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Контроль корректности заполнения дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru