Как распарсить txt в excel
Есть .txt файл, в котором 900 миллионов строк, разбитые по столбцам. Из этого файла нужно получить примерно 200к строк и выгрузить их в Excel по идентификатору в одном из столбцов. Как это можно сделать технически? Возможно, что с помощью SQL
Да, там есть разделитель в виде "|". Фрагмент приложить не могу, в данный момент, к сожалению. Но там 5 столбцов и 900 миллионов строк, разделенные "|"
Если под рукой есть Access - импортируете txt в таблицу, затем выбираете нужные вам данные и экспортируете их в Excel. В любом случаее, более 1 млн строк на лист не сможете загрузить
900 миллионов строк можете даже не пытаться в эксель выгрузить. Можете хоть примерно оценить количество вытягиваемых строк? если их там реально будет несколько млн или десятков млн, то врядли вы сможете с этим работать в экселе.
@NovitskiyDenis аксесс неделю будет импортировать столько строк, по моему :) и я что то сомневаюсь, что сделает это по итогу :)
3 ответа 3
Если установлен access, то можете попробовать получить данные из файла через Microsoft Access Text Driver:
- Вкладка "Данные" выбираем "Из других источников" и там "Из Microsoft Query"
- Выбираем новый источник данных и задаем имя источника и драйвер
- Нажимаем кнопку "Связь", задаем каталог, где лежит текстовый файл и нажимаем "Параметры>>" и "Определить формат". Там задаем разделить "|", определяем поля и их типы, из скриншота думаю все понятно.
- Создаем запрос, выбираем какие поля включить в запрос
Для примера я сгенерировал файл из случайных данных, 5 целочисленных полей с разделителями "|" из 2.000.000 строк Выборка по 2 условиям получилась на 500.000 строк по времени на моем компьютере заняло около 10 секунд
Здравствуйте, Форумчане! Вопрос состоит вот в чём, у меня имеются данные в формате txt файла, необходимо с помощью макроса выгружать данные из этого файла и формировать таблицы с ними. Выбор файла должен быть свободным и на усмотрение пользователя, а книга Excel при открытии автоматически запускала макрос и предлагала нажать на необходимые для операции кнопки (Выбор файла; Выгрузить данные; Выход). Я сделал макрос для выгрузки данных из txt файла, так же сделал кнопку позволяющую выбирать txt файлы пользователем в любой папке на его усмотрение, но не смог привязать её к кнопке "Выгрузить данные", так же проблема в том, что в создающейся таблице имеются пустые ключевые строки "Табельный номер" и эти строки необходимо полностью автоматически удалять и поднимать нижнюю строку на место пустой, чтобы не создать разрывы. Подскажите как лучше всего это сделать, пожалуйста. Файл txt прилагаю и сам файл с недоработанным макросом.
Чтение данных из txt файла и запись их в Excel
помогите пожалста. Такая вот проблемка. Есть файл (*.txt) в нём такой вот текст примерно.
Сформировать макрос по выгрузке данных из файла excel в файл txt
Здравствуйте. Срочно. Помогите пожалуйста сформировать макрос по выгрузке данных из файла excel.
Перенос данных из файла .txt в таблицу Excel
Ребята, нужна помощь. Надо выгрузить часть данных (номер карты, сумму, ФИО)из txt файла в.
Delphi и Excel. Генерация номеров и выгрузка в txt
Добрый. Имею таблицу excel, которая содержит диапазон значений вида 000001-001000, следом.
Я бы отказался полностью от функций екселя открытия текстового файла, а открыл древним способом
Например с разбивкой в массив по стокам
А потом обработать массив строк
Добавлено через 10 минут
И потом: Что толку, что файл выбран?
Ведь путь нигде не сохранён!
На строку
Добавлено через 8 минут
И потом не понятно что принимать к обработке?
Какие строки?
Только те где есть таб.№?
К обработке надо принимать всю информацию находящуюся в txt файле, но при выгрузке этой информации в Excel он должен автоматически разбивать эти массивы строк на столбцы и по возможности учитывать длину слов в столбцах, чтобы не получалось так, что одно ФИО очень длинное и часть его переходит в столбик с табельным. Присутствуют строки, где отсутствует табельный номер у людей, не понимаю как сделать так, чтобы эти люди вместе со всеми по ним данными автоматически удалялись и остались лишь те, у кого есть табельный номер. При этом количество людей в списке постоянно разное и надо привязаться именно к тому факту, что удаляться люди с пустыми табельными будут до самого конца списка, а не как я предполагал сделать - привязкой к интервалу ячеек Excel. Выбор файла я сделал более-менее, но никак не могу привязать эту кнопку к кнопке Выгрузка данных, попробую еще поискать про это информацию, может получится всё-таки.
Вариант хороший, но если уже конкретно, то смысл таков, я теперь не беру табельные номера и вместо них использую подразделения, от автозапуска формы VB я тоже отказался и сделал всё в одной кнопке, но проблемы те же с формированием таблицы. Я скинул вариант как всё должно выглядеть внешне и файл мой, который пока так не может сделать всё. Таблица может быть из 9000 строк и необходимо, чтобы существующие столбцы после разделения и формирования еще и выделялись границами, а время пребывания на объекте выглядело как в эталонном варианте внешнего вида "Для выгрузки(Прототип)(v.2.0)(Как должно быть)". Теперь сотрудники должны удаляются все, кроме тех, у кого в подразделении присутствует слово "Цех . ". Еще границы таблицы надо как-то привязать к словам, чтобы в независимо от размера текста они охватывали всю таблицу от начала до конца.
Ваш код хорош, но без комментариев мне в нём тяжело разобраться) Как осуществляется в нем проверка на наличие текста в каждой ячейке? Я заметил, что если список продолжить, то дальше он не учитывается в обработке, возможно ли осуществить выгрузку данных и очистку от ненужного до самого конца текста в файле независимо от размера информации в нем?
Вся проблема в формате файла
Я сделал код именно для требований указанных в вопросе
Если что не понятно смотри Краткие описания основных функций и команд VB
Или задавыай конкретнее вопрос
Если конкретно, то возможно ли создать процедуру, которая будет вытаскивать всю информацию из txt файла но начиная со слова Сотрудник и заканчивать на последнем времени пребывания, а то при выгрузке информации попадается еще лишняя информация сверху таблицы с данными и после неё?
Именно тут нету ничего лишнего, но сейчас я отказался от Табельного номера и вместо него сделал Подразделения, так же добавил строку Время пребывания на объекте после каждой фамилии. Когда я включаю макрос, то выгружается не вся информация. Вот этот файл попробуй выгрузить, в нём это заметно.
Завтра будет файл другой структуры?
Добавлено через 8 минут
ВЕСЕЛКОВ МИХАИЛ АРКАДЬЕВИЧ родился на производстве?
Есть только уход!
Добавлено через 3 минуты
Если так легко переделать структуру файла txt, то уж сделай её более обрабатываемой
Добавлено через 22 минуты
Хотя бы ФИО пиши в одной строке, а не в 2
КОНДРАТЬЕВ ВЛАДИМИР АЛЕКСАНДРОВИЧ Цех 35 Приход 06:58:38 27/07/15
Добавлено через 3 минуты
Нет, у него в подразделении стоит 02, это какой-то отдел, но интересуют только люди у которых присутствует слово Цех в подразделении. Структура изменилась по определенным условиям. Сам файл выгружается из программы в формате txt и сколько я не бился головой об стену, она только в таком виде и выгружается. Там нету даты рождения, а есть столбцы:
1. Сотрудник;
2. Подразделение;
3. Должность (пустой столбик пока, в будущем туда будут записываться номера отделов из одного цеха);
4. Пустой столбик, который можно назвать - Действие (это приход и уход);
5. Время
6. Дата
Уход как и приход может быть у сотрудника один или же повторяться по 4-10 раз, в зависимости от того, сколько раз он входил и выходил за территорию за 1 день, бывает такое, а вот наличие лишь одного Ухода или прихода у человека указывает на сбой в системе, это не страшно, главное показать эту информацию.
Я пытался сделать структуру более обрабатываемой, применяя в самой программе фильтры, но она упрямо написана и на неё они не действуют. Попробуй моей программой открыть этот файл (12(разработка)), на кнопку Подразделения нажми только.
Если отчество в одной строке с именем и фамилией, то ысё правильно.
А так можешь доделать что бы брало со следующей строки отчество
Выгрузка данных из таблиц
В informix есть возможность выгружать данные из таблиц в текстовый файл с разделителями следующим.
Формирование TXT файла
есть код который формирует txt файл с данными, по нажатии пользователем кнопки этот файл.
Формирование txt файла
День добрый! Помогите разобраться с задачей: имеется, скажем, пять папок, в каждой из которых есть.
Хочу поделиться опытом.
Была поставлена задача с помощью VBA Excel читать строки из огромного (более 200Мб) текстового файла, причем из конца в начало. Проводить операции поиска в этих строках, отбирать нужные и т.д.
Поискав в интернете, я так и не нашел более-менее готового варианта, хотя народ спрашивал.
Я написал макрос, который загружает данный текстовый файл в буфер по частям из конца в начало и производит поиск строк уже в буфере также из конца в начало.
Строки ищутся функцией InStrRev по вхождению символа vbLf.
Работает довольно шустро. (200Мб текста - в моем случае примерно 1,5 млн. строк перебирает за 10-15сек, на моем не очень слабеньком компьютере).
Если у кого возникнут корректировки для увеличения скорости обработки или обработки возможных ошибок, думаю будет уместно код скорректировать.
Парсинг строк из текстового файла
Доброго времени суток, господа! Уже n-ое количество времени мучаюсь со следующей задачей: .
Парсинг текстового файла и запись данных в Excel
есть текстовый док с такими строками : HS oper-209 UN Linux HS oper-203 UN Linux нужно.
Парсинг огромного XML файла
Здравствуйте! Пытаюсь распарсить большой xml файл. Для этого загружаю его в память и на этом.
Чтение огромного текстового файла
Добрый день, скажите, как можно очень быстро прочитать текстовый файл? Нашёл код на stackoverflow.
Хорошая работа, зачет. Есть вопросы: 1. размер буфера в 512 Кб для оператора input установили опытным путем?
2. Почему не использовали готовую библиотеку
scrypting.fso?
Предложения: введите процедуру обработки ошибок, возможные ошибки: 1. файл не существует. 2. файл уже открыт (занят) другим приложением. 3. Прочие ошибки, которые, нельзя предусмотреть.
По-моему, модуль получился слишком большой, если учесть еще код обработки строк, попробуйте разбить его, или оформить в виде отдельного класса, который будет работать примерно так же, как объект текстстрим в fso. Этот класс потом можно будет использовать в дальнейшем. Остальные замечания по коду несущественны, они вряд ли повлияют на общее быстродействие.
Если использовать тип Long, то файл ограничится размером в 2Гб, думаю тогда можно сделать тип Single. Встречал в интернете, что некоторым нужно было обрабатывать большие файлы, размером в 10Гб.
Размер буфера я пробовал менять от 100Кб до 10Мб, особой разницы я не заметил, зато при 10Мб требуется мегабайт 20 оперативки дополнительно. Величина в 512Кб вполне подходит и по скорости и по объему оперативки.
scripting.fso не использовал, т.к. посчитал что данный способ простой и вполне понятный, мне кажется это на скорость не повлияет, т.к. операций чтения файла происходит немного, и при этом эта библиотека все равно не имеет операторов, чтобы читать файл задом наперед построчно.
Обработку ошибок при открытии файла не писал, т.к. сроки поджимали, важно было сделать сам алгоритм
Модуль и вправду большой получился. Оформлять в виде класса идея хорошая, может и сделаю, пока не до этого.
Всем спасибо. Может кому пригодится.
kuryshevdmr, toiai прав. Нужно использовать long. Single не подходит, т.к. данные в single (и в double) хранятся с погрешностью. Так что данные с плавающей точкой ты употребляешь не к месту. Это может проявиться самым неприятным образом. Кроме того, функцию mid лучше употреблять в виде mid$. Так она сразу возвращает строку, а mid возвращает variant (что замедляет обработку).
А надо из всего этого сформировать табличку в Excel - приблизительно такого вида:
На помощь придёт функция DATfolder2Array
Код функции DATfolder2Array:
Комментарии
Последнюю строку в статье прочитайте
Надо скопировать в конец кода функцию из другой статьи
Не понимаю, что я делаю не так
Даже без исправлений выдает ошибку "sub or function not defined"
У кого заработало ?
У меня возникла проблема с
Function DATfolder2Array(ByVal FolderPath$, ByVal ColumnsCount As Long, _
ByVal TextColumns$, ByRef ErrorsArr) As Variant
Есть ли работающий вариант?
Найдите в коде строку
Запись ro = Replace(ro, vbTab, ";") заменяет разделитель табуляцию на точку с запятой
По аналогии, можно выполнить и другие замены? для других разделителей
Например, чтобы запятая тоже считалась разделителем, то дополните строку еще одной командой замены:
А можно указать несколько разделителей, если да, то как?
Цифра 7 в этой строке DataArr = DATfolder2Array(Папка, 7, "1,2,4,5", ErrorsArray) я так понимаю указывает на количество столбцов ?
Если до то как сделать без явного указания, чтобы определял из текстовика с разделением через ";" ?
Большое спасибо за Ваши разработки.
Здравствуйте, Иван.
В вашем случае нужен совсем другой, более сложный, макрос. Можем сделать под заказ.
Нет, там функция считывает файл целиком
Если требуется частично файл загружать - это надо другой макрос делать
Спасибо за ответ.
По ходу возник еще вопрос: с помощью функции ReadTXTfile можно выбрать не все строки файла, а только определенные (скажем со 2 по 20)
Здравствуйте, Владимир
Код написан под разделитель столбцов ; (точка с запятой)
Поменяйте в коде ; на , — и всё
Всего в 2 строках надо поменять:
Добрый день, подскажите если не сложно.
В файлах данные разделяются при помощи - ","
Сложно переделать ваш код для того что бы он распознавал такое разделение?
Беру свои слова обратно, все работает
Пробовал запустить выполнение макроса на сбор данных из несколькоих txt файлов в Excel, но ничего не получается. Нельзя ли выложить пример рабочего файла?
Аналогичная проблема, не могу делать удобоваримым под CSV.
У меня тоже с прибора каждые 3 часа файл вылазит.
Я так понимаю что для импорта файлов с таким форматом строки достаточно в коде сделать так: ' считываем данные из все файлов .DAT в папке в двумерный массив
DataArr = CSVfolder2Array(ПапкаДляФайлов$, 66, "2", ErrorsArray), однако импорта не происходит.
А именно и будет много однотипных файлов: каждые сутки прибор формирует CSV файл с именем типа дд_мм_гг.scv, и строки типа:(22:31:35;Time; 1,02400e+03;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;) т.е. время,служебная информация и далее непосредственно данные до 64 значений. Требуется импорт столбца времени и столбцов данных из этих файлов, но при этом в Excel первым столбцом должна быть еще и дата из имени файла или должен создаваться новый лист с именем файла, т.е. датой.
А почему вы решили взять за основу именно этот макрос?
Этот код предназначен для сложной обработки папки с однотипными файлами,
а для одиночного файла макрос подойдёт попроще.
У меня на сайте много примеров таких макросов - выбирайте любой.
Например, можете взять за основу макрос загрузки CSV в Excel
Есть CSV файл состоящий из 66 столбцов, как изменить макрос чтобы импортировать данные из файла?
не показывает то что нужно,я не пойму где в этом макросе указывать строчки которые нужны из документов
Мой макрос загружает ВСЕ строки из текстовых файлов
(а в примере, ссылку на который я дал в предыдущем комментарии, - все строки, кроме первых)
Более того, при вызове функции нужно указывать количество загружаемых столбцов.
К тому же, этот код не универсальный - прямо в функции прописаны разделители строк и полей (точка с запятой, и перевод строки)
Если у вас другие разделители - либо изменяйте код функции, либо ждите, пока я опубликую новую статью с универсальным вариантом макроса загрузки данных из текстовых файлов.
В другой статье я выложил пример использования этого макроса:
(смотрите пример №2 - нажатием первой (зеленой) кнопки скачаете файлы, а нажатием второй (желтой) кнопки, загрузите данные из файлов CSV на лист)
У меня тож не показывает то что нужно,я не пойму где в этом макросе указывать строчки которые нужны из документов,может в этом все дело.
Может и хороший макрос, но.. Увы, не работает.
Добавьте ниже этого макроса код функции ReadTXTfile, взяв его здесь:
эту ошибку исправил, теперь пишет что команда не существует в этом месте newtxt = ReadTXTfile(FolderPath$ & filename)именно чтение TXT, и указывает на Function DATfolder2Array(ByVal FolderPath$, ByVal ColumnsCount As Long, _
ByVal TextColumns$, ByRef ErrorsArr) As Variant что теперь то не так может быть?
PS: Код взят из рабочего файла - так что ошибок быть не должно.
макрос не запускается пишет значение вот этого кода неоднозначно: Function DATfolder2Array(ByVal FolderPath$, ByVal ColumnsCount As Long, _
ByVal TextColumns$, ByRef ErrorsArr) As Variant
что это может быть?
Соавтор(ы): Nicole Levine, MFA. Николь Левин — автор и редактор, пишущий о технологиях для wikiHow. Имеет более 20 лет опыта в написании технической документации и руководстве командами технической поддержки в крупных компаниях, занимающихся веб-хостингом и разработкой программного обеспечения. Получила магистерскую степень по писательскому мастерству в Портлендском государственном университете и преподает композицию, литературное творчество и создание фэнзинов в различных учебных заведениях.
В этой статье мы расскажем вам, как в Windows 10 текстовый файл (.txt) преобразовать в Excel-файл (.xlsx).
Запустите Microsoft Excel. Для этого введите excel в строке поиска Windows, а затем щелкните по «Microsoft Excel».
Выберите текстовый файл, который нужно преобразовать, а затем нажмите Открыть . Откроется окно мастера импортирования текста.
Выберите тип данных и нажмите Далее . В разделе «Тип исходных данных» выберите «С разделителями» (если в текстовом файле есть данные, которые разделены запятыми, табуляцией или любым другим способом), или выберите «Фиксированной ширины» (если данные содержатся в столбцах, а между каждым полем с данными есть пробел).
- Если до этого вы выбрали опцию «С разделителями», установите флажок у соответствующего символа (или у «Пробел», если данные разделены пробелами), который используется для разделения данных.
- Если до этого вы выбрали опцию «Фиксированной ширины», просто следуйте инструкциям на экране.
Укажите формат данных столбца. Для этого установите флажок у соответствующей опции (у «Общий», «Текстовый» или «Дата»).
Дополнительные статьи
Об этой статье
Читайте также: