Огромный текстовый файл в маленькие файлы Excel

У меня есть огромный текстовый файл (4 ГБ), где каждая "строка" имеет синтаксис: [number] [number]_[number] [Text].
Например

123 12_14 Text 1
1234 13_456 Text 2
33 12_12 Text 3
24 678_10 Text 4

Моя цель - сохранить эти данные в виде файла Excel, где каждая «строка» в текстовом файле
является строкой в ​​файле Excel. Согласно прошлому примеру:

[A1] 123
[B1] 12_14
[C1] Text 1
[A2] 1234
[B2] 13_456
[C2] Text 2
[A3] 33
[B3] 12_12
[C3] Text 3
[A4] 24
[B4] 678_10
[C4] Text 4

Мой план состоит в том, чтобы повторить текст "строки", как указано здесь, разделить "строки",
и сохранить к ячейкам в файле Excel.

Из-за проблемы с размером текста я решил создать много небольших файлов Excel, которые все вместе будут равны текстовому файлу.

Затем мне нужно проанализировать небольшие файлы Excel, в основном найти термины, которые упоминаются в ячейках [Text], и подсчитать количество появлений, связанных с ячейками [number] (представляющих сообщение и идентификатор сообщения).

Наконец, мне нужно суммировать все эти данные в файле Excel.

Я рассматриваю лучший способ создания и анализа файлов Excel.
Как уже упоминалось здесь, основными библиотеками являются xlrd и csv.


person Presen    schedule 14.08.2013    source источник
comment
Если вашей единственной целью является анализ исходного текстового файла (такие вещи, как подсчет материала...), то это очень не самый простой способ сделать это. Если у вас есть какая-то другая причина получить кучу файлов Excel, продолжайте.   -  person Brionius    schedule 14.08.2013
comment
Вам не нужно загружать весь текстовый файл в память, вы можете просто прочитать текстовую строку, строка. Разделенный текст в виде excel совершенно не нужен.   -  person Daniel    schedule 14.08.2013
comment
@Brionius Я почти уверен, что у меня нет других вариантов, кроме небольших файлов Excel, но какой будет другой подход?   -  person Presen    schedule 14.08.2013
comment
@simpleBob предложенный код (stackoverflow.com/questions/18178089/) не загружайте весь текст в память   -  person Presen    schedule 14.08.2013
comment
@pnuts Это была ошибка новичка, извините.   -  person Presen    schedule 14.08.2013
comment
@user1869297 user1869297 - трудно сказать, каким был бы другой подход, если я не знаю, какова ваша настоящая цель - если вы можете уточнить, какова конечная цель всего этого бизнеса, мы можем помочь вам найти лучший способ.   -  person Brionius    schedule 14.08.2013
comment
читать файл построчно в excel: stackoverflow.com/questions/11528694/   -  person SeanC    schedule 14.08.2013


Ответы (2)


«Я почти уверен, что у меня нет других вариантов, кроме небольших файлов Excel, но каким будет другой подход?»

Ваш огромный текстовый файл — это своего рода база данных, хотя и неудобная. Куча небольших файлов Excel — еще одно, еще менее удобное представление той же базы данных. Я предполагаю, что вы хотите создать кучу небольших файлов, потому что у Excel есть верхний предел количества строк, которые он может содержать (65 000 или 1 000 000 в зависимости от версии Excel). Однако, как уже было отмечено, файлы Excel представляют собой поистине ужасные хранилища баз данных.

Поскольку вы уже используете Python, используйте модуль sqlite3, он уже встроен и это настоящая база данных, и она может обрабатывать более миллиона строк. И это быстро.

Но я хотел получить представление о том, насколько быстро это происходит с данными в масштабе, который вы предлагаете, поэтому я создал базу данных на 30 миллионов строк примерно такой же сложности, как ваш набор данных. Схема проста:

create table words
    (id integer primary key autoincrement not null,
     first text, second text, third text);

и заполнил его случайными триграммами, взятыми из /usr/dict/words (у меня есть модуль для генерации тестовых данных, подобных этому, который делает записи, которые выглядят как

sqlite> select * from words limit 5;
1|salvation|prorates|bird
2|fore|embellishment|empathized
3|scalier|trinity|graze
4|exes|archways|interrelationships
5|voguish|collating|partying

но простой запрос строки, которая, как я знал, приближалась к концу, занял больше времени, чем я надеялся:

select * from words where first == "dole" and second == "licked";
29599672|dole|licked|hates

заняло около 7 секунд на довольно среднем 3-летнем рабочем столе, поэтому я добавил пару индексов

create index first on words (first);
create index second on words (second);

что удвоило размер файла базы данных с 1,1 ГБ до 2,3 ГБ, но сократило время простого запроса до довольно разумных 0,006 секунды. Я не думаю, что вы справитесь с Excel.

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

person msw    schedule 15.08.2013

В чем проблема просто перебирать файл построчно? Если вы настроены на Excel, я бы рекомендовал openpyxl.

person Martyn    schedule 14.08.2013