Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/88: Рейтинг темы: голосов - 88, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34

Как разбить огромный csv файл

30.12.2016, 14:33. Показов 19495. Ответов 51

Студворк — интернет-сервис помощи студентам
Добрый день, помогите решить задачу: есть ексель файл на 5000 строк и есть огромный csv файл на 1,16 Гбайт, нужно найти совпадающие значения в этих файлах пробовал через функцию ВПР находится все до 1000000 строк, а больше ексель не показывает так как стоит ограничение в этом пределе, а сам csv файл предположительно на 50000000 строк я хочу его разбить на 50 меньших файлов и по отдельности произвести поиск совпадающих строк, как это можно сделать? Или подскажите пожалуйста другой способ найти совпадающие строки с моим маленьким файлом и этим огромнейшим csv файлом
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.12.2016, 14:33
Ответы с готовыми решениями:

Как разбить файл на две части, разархивировать и изменить вторую часть, а потом собрать файл обратно?
Здравствуйте! Хочу поднять тему Ципиховича Эндрю (в праве поднять тему отказано: новый вопрос, новая тема - примечание модератора). ...

Разделить огромный txt файл на куски и поместить в различные книги excel
Здравствуйте, уважаемые форумчане! У меня есть огромный файл txt, который нужно разделить на части и эти части поместить в книги excel....

Как сохранить в csv utf8 кодировки файл из exсel?
Как сохранить в csv utf8 кодировки файл из exel?

51
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
30.12.2016, 14:38
50 миллионов строк? Это же кто такой файл родил?


Откройте csv как обычный текстовый файл, и построчно считывая, разбивайте как хотите.
0
 Аватар для bedvit
1208 / 259 / 22
Регистрация: 20.05.2016
Сообщений: 1,136
Записей в блоге: 21
30.12.2016, 14:40
Можно попробовать Access или Pover Pivot for Excel или sql-запрос
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
30.12.2016, 15:07
5000 строк в словарь, затем читаете построчно скриптом текстовый файл и ищите совпадение в словаре, думаю за пару тройку минут может отработать.
1
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
30.12.2016, 18:56
aroma4s, приложите часть Excel файла, часть csv и то, что нужно получить с помощью ВПР.
Без этого будут только общие рассуждения.

Добавлено через 10 минут
Да, вырезать часть гигового файла тоже проблема Можно сделать с помощью hex-редактора, например HxD https://mh-nexus.de/en/hxd/
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
30.12.2016, 22:24
Цитата Сообщение от Казанский Посмотреть сообщение
Да, вырезать часть гигового файла тоже проблема
Да, скорее всего могут быть проблемы даже если файл читать не полностью, а построчно.

А с небольшими файлами проблем нет.
Вот такой код разбивает файл в 1 млн.строк (примерно 27мегабайт) на файлы по 10000 строк за 10 секунд.
Visual Basic
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
Option Explicit
 
Sub SplitCSV()
    Dim st() As String, s As String, i As Long
    Dim n As Long, k As Long, m As Long
    On Error Resume Next
    MkDir (ThisWorkbook.Path & "\Result")
    On Error GoTo er
    n = 10000 'на сколько строк разбиваем файл
    Open ThisWorkbook.Path & "\1.csv" For Input As #1
        Do
           ReDim st(1 To n)
           k = 0
           Do
              k = k + 1
              Input #1, s
              st(k) = s
           Loop Until EOF(1) Or k >= n
           m = m + 1
           Open ThisWorkbook.Path & "\Result\Part_" & CStr(m) & ".csv" For Output As #2
              For i = 1 To n
                  Print #2, st(i)
              Next i
           Close #2
         Loop Until EOF(1)
    Close #1
    MsgBox "OK"
Exit Sub
er: MsgBox "Error" & vbCrLf & Err.Description, vbCritical
End Sub
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
31.12.2016, 00:23
SoftIce, я имел в виду - как взять часть огромного файла, чтобы выложить на форум. Ведь Блокнотом его не откроешь, а через Excel долго и при сохранении могут возникнуть искажения.
Вот код, которым можно получить первые 1000 строк большого файла менее чем за секунду:
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub GetFirstRows()
Dim i&, s$
  Open "c:\temp\myfile.csv" For Input As #1 'огромный файл
  Open "c:\temp\myfile1.csv" For Output As #2 'новый файл
  For i = 1 To 1000
    Line Input #1, s
    Print #2, s
  Next
  Reset
End Sub
0
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34
31.12.2016, 02:00  [ТС]
База данных недействительных паспортов

Понимаете, вы умнее меня и я не понимаю что вы имеете ввиду, можете подробно объяснить как это реализовать

Добавлено через 2 минуты
SoftIce, База данных недействительных паспортов

Понимаете, вы умнее меня и я не понимаю что вы имеете ввиду, можете подробно объяснить как это реализовать?

Добавлено через 1 минуту
bedvit, Я как то читал что можно загрузить csv в access и потом разбить на подмножества, не подскажите как это можно сделать?

Добавлено через 3 минуты
Hugo121, Можете подробней рассказать как загрузить в словарь и как считать такое количество строк?

Добавлено через 10 минут
Казанский, приложить не могу так как на работе нету доступа к интернету и копировать на флешку файлы нельзя,

В кратце: я делаю один лист со своими 5000-ми значениями, и второй лист на 1000000 значений с помощью впр искомые значения из 1-го листа ищутся во 2-м листе, если одинаковые значения есть то напротив строки со значением выводится тоже самое значение, если таких значений во 2-м листе нет то пишется Н/Д т.е. недопустимое данное, имеется ввиду что совпадений нет

мне нужно разбить 50000000 строчный файл по 1000000, чтобы я мог вставлять во второй лист и тем самым искать совпадающие значения

Добавлено через 8 минут
SoftIce, Казанский,
я думаю VB используется для видимых значений т.е. до 1000000, но никак не те что за границей поэтому я думаю тут либо нужно какой нибудь отдельный скрипт *.vbs написать либо как то с помощью access сделать подмножества cvs файлов
моя функция ВПР примерно выглядит так =ВПР(A7;'Лист2'A:A;1;ЛОЖЬ)
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
31.12.2016, 08:39
Слушай Hugo121! Зря не скажет!
Примерно так:
Visual Basic
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
Sub qwert()
Dim sl: Set sl = CreateObject("scripting.dictionary") '
Dim r, ri, lr, m(), t
 
'''*********************просто заполнение уникальными значениями.
'Randomize
'For r = 1 To 5000
'    Do
'        t = Int(1000001 * Rnd)
'    Loop While sl.exists(t)
'    sl(t) = r
'Next r
' ActiveSheet.[a1].Resize(sl.Count) = Application.Transpose(sl.keys)
''***************************************
 
With ActiveSheet
    lr = .Cells(.Rows.Count, 1).End(xlUp).Row
    m = .[a1].Resize(lr, 2).Value
    For r = 1 To 5000
        sl(m(r, 1)) = r 'запоминаем значение и номер строки в словарь
    Next r
 
'словарь заполнен уникальными. дальше работа с файлом.
'Проверять не на чём. моделировать лениво. Примерно так:
 
 Open "c:\temp\myfile1.csv" For Input As #1 'огромный файл
  
'цикл выполняется, пока конец файла не достигнут
        Do Until EOF(1)
           'при каждом вызове оператора Line Input он записывает в
           'переменную новою строку
          Line Input #1, t
        '  тут с переменной t возможно надо что-то сделать
            t = t
        '    и потом проверить наличие в словаре
            If sl.exists(t) Then ' если в словаре есть
        '    например можно поставить метку в массив
                ri = sl(t) '
                m(ri, 2) = "есть такое" '
            End If
        Loop
    Close
     .[a1].Resize(lr, 2) = m ' массив с результатом вывалить на лист
End With
 
End Sub
2
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
01.01.2017, 22:21
Как вариант кода Alex77755 - можно массив m делать из одного столбца, а для результатов создать такой же пустой, который в финале выгрузить рядом с исходными данными - так сэкономите память и вероятно чуть скорость - после того, как данные помещены в словарь, этот массив m можно убить, он больше не нужен.
Или как другая вариация - совпавшие (или несовпавшие) номера собирать в коллекцию, которую в финале выгрузить куда-нибудь - так сразу получите только нужные номера.
0
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34
03.01.2017, 15:11  [ТС]
Alex77755, спасибо что предложили вариант решения, попробую сделать, только вопрос что за зелёный комментарий выглядящий как код, его нужно писать?

Добавлено через 11 минут
Hugo121, спасибо что сказали, но на словах можно сколько угодно объяснять но мне все равно не понять как это реализовать
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
03.01.2017, 18:05
Цитата Сообщение от aroma4s Посмотреть сообщение
но на словах можно сколько угодно объяснять
- согласен. Это же могу адресовать и Вам
Код Вам уже дали, а файлов никто не видел... Я обычно жду файла, чтоб впустую не работать - судя по теме это верный подход, раз при уже наличии кода возникают вопросы.
А зелёный комментарий это и есть комментарий, он только для информации, можете его не копипастить
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
03.01.2017, 20:02
Цитата Сообщение от aroma4s Посмотреть сообщение
приложить не могу так как на работе нету доступа к интернету и копировать на флешку файлы нельзя
значит, запомните или запишите на бумажку структуру csv файла (не данные!). Надо понять:
- сколько там полей (т.е. столбцов при импорте в Excel);
- что является разделителем полей - запятая или точка с запятой;
- значения в целевом столбце записаны как числа или как текст (в кавычках).
Потом в другом месте, где есть доступ к инету, воссоздайте csv файл из нескольких строк с произвольными данными, воссоздайте Excel файл, убедитесь, что та же формула с ВПР работает правильно (фактически нужна функция ПОИСКПОЗ, но не суть), и выложите это все сюда.

Предложение по алгоритму: сначала из Excel файла в словарь (или коллекцию), как в примерах выше, а потом в цикле по значениям из csv удалять из словаря ключи, тем самым уменьшая его и ускоряя процесс. В конце останутся только те ключи, которых не нашлось в csv файле.
0
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34
09.01.2017, 10:51  [ТС]
Hugo121, Казанский,
Попробую сегодня-завтра пример скинуть, но они думаю особо не помогут
В общем я сейчас на работе написал этот код в модуль, пишет invalid outside procedure, написал в лист вроде что то делает но пишет что ексель не отвечает при этом оперативная память на неё постоянно растёт, не знаю сколько ждать нужно но сейчас жду может выведет что, стоит ли ждать больше 20 мин или это бесполезно и в коде что то не так написал?

Добавлено через 30 минут
Закрыл это файл и vba написал out string space
0
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34
10.01.2017, 00:52  [ТС]
Hugo121, Казанский,
Вот очень маленькая модель того что я делал, в моём файле объединил серию и номер с запятой, чтоб было также как в csv файле, затем на второй лист в моём файле копировал значения с csv файла и с помощью функции ВПР находил что совпадает, а что не совпадает пишет Н/Д.

По сути всё ок, но проблема что если с csv начать импорт с 2000000, то он выдаст только одну под этим номером ячейку остальные импортировать не хочет
Вложения
Тип файла: xlsx Мой файл.xlsx (8.8 Кб, 7 просмотров)
Тип файла: xlsx Часть гигантского файла.csv.xlsx (8.1 Кб, 3 просмотров)
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
10.01.2017, 00:56
Не нужен "Часть гигантского файла.csv.xlsx", нужен оригинальный файл.csv но не весь, а например пара сотен строк с начала.
0
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34
10.01.2017, 01:15  [ТС]
Hugo121,
Так это и есть по сути оригинал, он отличается только форматом, сюда csv загрузить нельзя, если переименуете формат тоже самое будет
К тому же как вывести только определенные строки из csv файла без использования копирования?
Если интересен прям оригинал в поиске пишите база данных недействительных паспортов и сразу в первой ссылке можете ее полностью скачать
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
10.01.2017, 03:13
Цитата Сообщение от aroma4s Посмотреть сообщение
Так это и есть по сути оригинал, он отличается только форматом
Правильно, отличается. Сохранив ваш csv.xlsx как csv, вполне можно не получить исходный csv.
Поймите наконец, что предлагаемые Вам решения НЕ БУДУТ вносить данные из csv на лист. Все будет происходить в коде, а для него крайне важны детали того, как "устроен" csv - см. #13.
Цитата Сообщение от aroma4s Посмотреть сообщение
сюда csv загрузить нельзя
В архиве - можно.
Цитата Сообщение от aroma4s Посмотреть сообщение
К тому же как вывести только определенные строки из csv файла без использования копирования?
Конечно, копирование необходимо. Но без преобразования формата! Лучше всего с помощью HEX-редактора, см. #5. Или простого макроса, см. #7.
Цитата Сообщение от aroma4s Посмотреть сообщение
Если интересен прям оригинал в поиске пишите база данных недействительных паспортов и сразу в первой ссылке можете ее полностью скачать
Бл@... а сразу нельзя было сказать?
Это, что ли? http://services.fms.gov.ru/inf... m?sid=2000
И к чему вся секретность, если данные в открытом доступе лежат?
Вот кстати уже есть решение по оптимизации поиска в этой базе: https://habrahabr.ru/post/307568/
Я ссылку на файл оттуда взял.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
10.01.2017, 03:27
Ну вот, пока писал пост, файл скачался и распаковался.
Разделителем строк в нем служит vblf, то есть chr(10), так что все коды с Line Input идут лесом
Вот часть файла... на сегодня все.
Вложения
Тип файла: zip list_of_expired_passports_PART.zip (5.2 Кб, 12 просмотров)
0
1 / 1 / 0
Регистрация: 07.05.2013
Сообщений: 34
10.01.2017, 20:31  [ТС]
Казанский,
Я говорил про свой файл, а про эту базу сразу в начале сказал
как с помощью метода из статьи хабра можно проверить 5000 наименований?

как вы его разделили? ну а вообще я видел информацию про разделения, но они для видимых значений, а больше миллиона он не увидит
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.01.2017, 20:31
Помогаю со студенческими работами здесь

Как сохранить VBA-массив в CSV-файл без Excel
Как можно сохранить VBA-массив в CSV-файл без использования Excel? Сейчас я сначала вставляю данные из VBA-массива в Excel, а затем...

Как разбить большой файл сохранив макросы во всех частях?
Есть необходимость разбить этот файл на несколько файлов (около 50), причём с сохранением в каждом файле макросов и форм. Соответсвенно...

Как разбить CSV файл на отдельные файлы
Всем привет, кто может подсказать решение, как разбить CSV файл состоящий из 100000 строк, на разные CSV файлы по такому принципу: в...

Запись в CSV-файл из массива. Не является форматом csv!
В общем искал работу... Дали тестовое написать парсер для сайта с выводом информации в csv-файл. Всё написал, сбросил, пришёл ответ что у...

Огромный EXE Файл , Нужна помошь
И так , ситуация такая , есть программа , которая берет файл(любой) и записывает его в конце другой программы(отныне шаблон) , которая...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru