Какие части текстового файла?

Обновлено: 04.07.2024

Эта заставка показывает, как импортировать различные текстовые файлы в R с помощью пакета readtext. В настоящее время readtext поддерживает простые текстовые файлы (.txt), данные в той или иной форме нотации объектов JavaScript (.json), значения, разделенные запятыми или символами табуляции (.csv, .tab, .tsv), XML-документы (.xml), а также файлы в формате PDF и Microsoft Word (.pdf, .doc, .docx).

readtext также обрабатывает несколько файлов и типов файлов, используя, например, выражение «glob», файлы из URL-адреса или архивного файла (.zip, .tar, .tar.gz, .tar.bz). Обычно вам не нужно явно определять формат файлов — readtext берет эту информацию из окончания файла.

Пакет readtext поставляется с каталогом данных extdata, который содержит примеры всех перечисленных выше файлов. В виньетке мы используем этот каталог данных.

Каталог extdata содержит несколько подпапок, содержащих различные текстовые файлы. В следующих примерах мы загружаем один или несколько файлов, хранящихся в каждой из этих папок. Команда paste0 используется для объединения папки extdata из пакета readtext с подпапками. При чтении пользовательских текстовых файлов вам нужно будет определить собственный каталог данных (см. ?setwd() ).

2.1 Обычные текстовые файлы (.txt)

Папка «txt» содержит подпапку с именем UDHR с файлами .txt Всеобщей декларации прав человека на 13 языках.

Мы можем указать метаданные уровня документа ( docvars ) на основе имен файлов или отдельного data.frame. Ниже мы берем docvars из имен файлов ( docvarsfrom = "filenames" ) и устанавливаем имена для каждой переменной ( docvarnames = c("unit", "context", "year", "language", "party")). Команда dvsep = "_" определяет разделитель (строку символов регулярного выражения), включенный в имена файлов для разграничения элементов docvar.

readtext также может проклинать подкаталоги. В нашем примере папка txt/movie_reviews содержит две подпапки (называемые neg и pos). Мы можем загрузить все тексты, содержащиеся в обеих папках.

2.2 Значения, разделенные запятыми или символами табуляции (.csv, .tab, .tsv)

Чтение значений, разделенных запятыми (CSV-файлы), содержащих текстовые данные. Мы определяем переменную texts в нашем файле .csv как text_field. Это столбец, содержащий фактический текст. Остальные столбцы исходного CSV-файла ( Year , President , FirstName ) по умолчанию рассматриваются как переменные уровня документа.

Та же процедура применяется к значениям, разделенным табуляцией.

2.3 Данные JSON (.json)

Вы также можете читать данные .json. Вам снова нужно указать text_field .

2.4 PDF-файлы

readtext также может считывать и преобразовывать файлы .pdf.

В приведенном ниже примере мы загружаем все файлы .pdf, хранящиеся в папке UDHR, и определяем, что docvars должны быть взяты из имен файлов. Мы называем переменные уровня документа document и language и указываем разделитель ( dvsep ).

2.5 Файлы Microsoft Word (.doc, .docx)

Файлы в формате Microsoft Word преобразуются с помощью пакета antiword для старых файлов .doc и с использованием XML для новых файлов .docx.

2.6 Текст из URL

Вы также можете читать текст прямо с URL-адреса.

2.7 Текст из архивных файлов (.zip, .tar, .tar.gz, .tar.bz)

Наконец, можно включать текст из архивов.

readtext изначально был разработан в ранних версиях пакета Quanteda для количественного анализа текстовых данных. Он был порожден функцией textfile() из этого пакета и теперь живет исключительно в читаемом тексте. Поскольку конструктор корпуса Quanteda распознает формат data.frame, возвращаемый функцией readtext() , он может создавать корпус непосредственно из объекта readtext, сохраняя все docvars и другие метаданные.

Вы можете легко создать корпус из объекта читаемого текста.

4.1. Удаление номеров страниц с помощью регулярных выражений

Если документ содержит номера страниц, они также импортируются. Если вы хотите удалить их, вы можете использовать регулярное выражение. Мы настоятельно рекомендуем использовать пакет stringi. Наиболее распространенные регулярные выражения вы можете найти в этой памятке.

Сначала необходимо проверить в исходном файле, в каком формате встречаются номера страниц (например, «1», «-1-», «страница 1» и т. д.). Мы можем использовать тот факт, что номерам страниц почти всегда предшествует разрыв строки (\n). После загрузки текста с прочитанным текстом вы можете заменить номера страниц.

В первом примере номера страниц имеют формат «страница X».

Во втором примере мы удаляем номера страниц в формате «- X -».

Такие строковые функции также можно применять к объектам чтения текста.

4.2 Чтение файлов с разными кодировками

Иногда файлы одного типа имеют разные кодировки. Если кодировка файла включена в имя файла, мы можем извлечь эту информацию и правильно импортировать тексты.

Здесь мы получим кодировку из самих имен файлов.

Если мы читаем текстовые файлы без указания кодировки, мы получаем ошибочно отформатированный текст. Чтобы избежать этого, мы определяем кодировку, используя созданную выше файловую кодировку символьного объекта.

Мы также можем добавлять docvars на основе имен файлов.

Из этого файла мы можем легко создать корпусный объект Quanteda.

Одной из наиболее часто выполняемых задач обработки данных является чтение данных из файла, манипулирование ими каким-либо образом, а затем запись полученных данных в новый файл данных для последующего использования в других целях. Для этого можно использовать рассмотренную выше функцию открытия для создания нового файла, подготовленного для записи. Обратите внимание, что в Таблице 1 выше единственная разница между открытием файла для записи и открытием файла для чтения заключается в использовании флага «w» вместо флага «r» в качестве второго параметра. Когда мы открываем файл для записи, создается новый пустой файл с таким именем, готовый принять наши данные. Как и раньше, функция возвращает ссылку на новый файловый объект.

В приведенной выше таблице 2 показан один дополнительный файловый метод, который мы до сих пор не использовали. Метод записи позволяет нам добавлять данные в текстовый файл. Напомним, что текстовые файлы содержат последовательности символов. Мы обычно думаем об этих последовательностях символов как о строках файла, где каждая строка заканчивается символом новой строки \n. Будьте очень внимательны и обратите внимание, что метод записи принимает один параметр — строку. При вызове символы строки будут добавлены в конец файла. Это означает, что программисты должны включать символы новой строки как часть строки, если это необходимо.

В качестве примера снова рассмотрим файл ccdata.txt. Предположим, что нас попросили предоставить файл, состоящий только из глобальной эмиссии и года этого изменения климата. Кроме того, сначала должен стоять год, а затем глобальная эмиссия, разделенная пробелом.

Чтобы построить этот файл, мы подойдем к проблеме, используя аналогичный алгоритм, описанный выше. После открытия файла мы будем перебирать строки, разбивать каждую строку на части, выбирать нужные нам части, а затем выводить их. В конечном итоге вывод будет записан в файл.

Приведенная ниже программа решает часть проблемы. Обратите внимание, что он считывает данные и создает строку, состоящую из года изменения климата, за которым следует глобальная эмиссия. В этом примере мы просто печатаем строки по мере их создания.

Когда мы запускаем эту программу, мы видим строки вывода на экране. Как только мы убедимся, что он создает соответствующий вывод, следующим шагом будет добавление необходимых фрагментов для создания выходного файла и записи в него строк данных. Для начала нам нужно открыть новый выходной файл, добавив еще один вызов функции open, outfile = open("emissiondata.txt",'w') , используя флаг 'w'. Мы можем выбрать любое имя файла, которое нам нравится. Если файл не существует, он будет создан. Однако, если файл существует, он будет повторно инициализирован как пустой, и вы потеряете все предыдущее содержимое.

После создания файла нам просто нужно вызвать метод записи, передав строку, которую мы хотим добавить в файл. В этом случае строка уже печатается, поэтому мы просто изменим печать на вызов метода записи. Однако есть еще одна часть строки данных, которую нам необходимо включить. Символ новой строки должен быть присоединен к концу строки. Вся строка теперь становится outfile.write(dataline + '\n') . Нам также нужно закрыть файл, когда мы закончим.

Список частей имени файла для перемещения в текстовом файле с помощью Limagito File Mover

В: Можно ли иметь список частей имени файла в текстовом файле и использовать его для перемещения любых файлов, имя которых совпадает с полным именем файла или частью имени файла в каталоге? Я просмотрел блог, но думаю, что это только для 1 файла с использованием части имени файла.

A: В версии v2021.7.9.0 мы добавили новую опцию для достижения этой цели. Мы добавили несколько снимков экрана, чтобы вы могли начать работу.

<р>1. Папка Windows в качестве источника. В этой папке будут все файлы. Мы будем фильтровать их, используя информацию из отдельного текстового файла.

Настройка исходного файла Limagito File Mover

Наша исходная папка содержит 244 файла:

Исходные файлы Limagito File Mover

2.Далее откройте параметр "Параметры правила" этого правила.

Параметры правила перемещения файлов Limagito

Выберите текстовый файл, содержащий части имени файла, которые мы будем использовать для фильтрации файлов, которые мы хотим скопировать.Мы выбрали «При начале правила» в качестве режима загрузки файла, поэтому содержимое этого текста будет перезагружаться при каждом начале правила. Мы также включили функцию «Перезагружать только при изменении содержимого файла», чтобы предотвратить ненужную загрузку этого файла.

Настройка содержимого файла Limagito File Mover

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

Ширина

Limagito File Mover File Parts as Content Filter

<р>3. Откройте настройку фильтра файлов и выберите вкладку «Содержимое файла» > «Включить». Включите новый параметр «Добавлять подстановочные знаки к записям содержимого файла в поиске».

При включении подстановочные знаки будут добавляться к каждой записи содержимого файла (в памяти) во время поиска.
т.е.
Предположим, что имя файла, найденного в исходной папке, будет: test.pdf
А включаемый файл FileContent будет содержать: test
Если эта опция включена, файл будет выбран, потому что мы будем проверять test.pdf с *тестом*

Настройка файлового фильтра Limagito File Mover

<р>4. В качестве места назначения мы также добавили папку Windows:

Настройка места назначения Limagito File Mover

<р>5. Результат журнала выполнения. Из исходных 244 файлов в исходной папке 216 были скопированы из-за фильтра содержимого файлов.

Мне нужно импортировать данные из примера со следующими критериями:
- ТОЛЬКО строки с R01 (чтобы строка R08 была пропущена)
- Нужна сумма в столбце
– Имя и фамилия (разделенные)
– Номера маршрутизации (9-значное число, которое обнуляется)
– Номера счетов (переменной длины)
– Строка из 13 символов, приведенная ниже имя

Я осмотрелся и думаю, что макросы — лучший способ сделать это.
проблема в том, что я не понимаю, с чего вообще начать.

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

Спасибо за вашу помощь..

Основываясь на опыте, я полагаю, что вы столкнетесь с некоторыми исключениями в исходном
файле, CR/LF, FF и т. д. Это создаст дополнительную строку, втолкнет поле и т. д., что
может сломать макрос.

1) Попросите их написать новый отчет
2) Используйте драйвер ODBC или доступ к данным Excel, чтобы обратиться к исходной
базе данных и извлечь только то, что вам нужно
3) Использовать средство создания отчетов или MS-Access для доступа к исходной базе данных и
извлечения данных

спасибо за ответ!

Исходный файл представляет собой файл TXT, который загружается с веб-сайта,
мусор, описанный в сообщении, представляет собой в основном лишний текст в
отчетном стиле (список номеров страниц и т. д.), это наш единственный доступ к
данным.

примерно 500 строк данных, в основном нерелевантных; вероятно,
100-200 строк необходимо ежемесячно отфильтровывать.

Как вы думаете, будет ли работать текстовый поток и поиск кода R01 и
использование функций CR/LF оттуда?

Вы должны установить ссылку на среду выполнения сценариев и использовать
FileSystemObject для чтения текстового файла по одной строке за раз. Вы можете использовать функцию
InStr для проверки каждой строки на наличие "R01" в самом начале. Если найден
R01, используйте функцию "Разделить", чтобы создать массив из текста
этой строки и заполнить следующую строку листа частями, которые вы
хотите записать

Монарх должен быть в состоянии легко справиться с этим и быть лучшим долгосрочным
решением. Лучше всего то, что нет необходимости поддерживать программирование (макросы). И, если
веб-сайт меняет форматирование, Monarch можно изменить проще, чем
макросы Excel.

Монарх должен быть в состоянии легко справиться с этим и быть лучшим долгосрочным
решением. Лучше всего то, что нет необходимости поддерживать программирование (макросы). И, если
веб-сайт меняет форматирование, Monarch можно изменить проще, чем
макросы Excel.


Я пытаюсь создать интерфейс с несколькими элементами управления редактированием, где каждое редактирование отображает только часть текстового файла. Моя идея состоит в том, чтобы создать текстовый файл со строкой "------", разделяющей мои идеи, и сделать так, чтобы первое редактирование отображало все до первого "------", чтобы второе редактирование отображало все оттуда до второго "------" и так далее.

Возможно ли это или есть более простой способ сделать это?


Чтение только частей текстового файла

Такого нет.

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

Для AHK у вас есть 2 варианта.

Вы используете FileOpen() для чтения всего файла в память (эта функция фактически создает из него объект. Этот объект имеет множество методов, так что вы можете легко читать/записывать в текстовый файл без необходимости писать свои собственные прочее. См. файловый объект).

Используйте цикл чтения . Я не уверен, сначала ли цикл чтения считывает все это в память, либо он читает по одной строке за раз от начала до конца по мере ее обработки. Придется посмотреть исходник AHK.

Для того, что ВЫ пытаетесь сделать, вам нужно прочитать весь файл и проанализировать его целиком. (Обратите внимание, что этот процесс не является интенсивным и не нагружает вашу оперативную память или ЦП. Чтение и запись на жесткий диск — обычный процесс для программ.)
StrSplit() — хороший кандидат для простого разделения разделенный список текста. В противном случае вы смотрите на цикл синтаксического анализа

Кроме того, лучше отформатируйте текстовый файл. Если вы знаете, что у вас будут разделы, не используйте ------ в качестве общего разделителя. Вместо этого используйте его (или что-то меньшее) в качестве префикса для ваших личных комментариев. Таким образом, вы сможете найти именно то, что вам нужно, когда вам это нужно.

Или вместо того, чтобы возиться с текстовыми файлами, циклами и прочим, попробуйте использовать файл .ini. Это файлы, созданные для организации групп данных. Примерно так.
Они используют названия разделов и ключей.

IniRead и IniWrite — это команды AHK для простого получения и установки информации ini.
Дополнительная информация об ini-файлах содержится в разделе «Прочитайте это перед публикацией!». прикрепленный обучающий пост.

Читайте также: