Альтернативы для расширенного чтения и синтаксического анализа текстовых файлов с использованием .NET
-
09-06-2019 - |
Вопрос
Мне нужно читать из множества различных текстовых файлов (у меня есть несколько файлов с разделителями и несколько файлов фиксированной ширины).Я рассматривал возможность построчного анализа файлов (медленно с использованием методов типа File.ReadLine) и чтения файла с помощью текстового драйвера ODBC (быстрее), но есть ли у кого-нибудь другие (лучшие) предложения?Я использую .NET / C #.
Решение 3
Отвечая на мой собственный вопрос:
В итоге я использовал объект Microsoft.VisualBasic.FileIO.TextFieldParser, см.
http://msdn.microsoft.com/en-us/library /f68t4563.aspx р>
(пример реализации здесь) / s> р>
Это позволяет мне обрабатывать csv-файлы, не беспокоясь о том, как справиться с тем, заключены ли поля в кавычки, содержат ли они запятые, экранированные кавычки и т. д.
Другие советы
Я не уверен, что вы могли бы действительно выполнить синтаксический анализатор текста и Excel, если только под файлом Excel вы не подразумеваете файл с разделителями-запятыми / трубой / табуляцией, который на самом деле является просто другим текстовым файлом. Чтение реальных файлов Excel требует использования библиотек MS Office.
Для разбора текстового файла с разделителями вы можете заглянуть в FileHelpers - с открытым исходным кодом, и они в значительной степени имеют это покрыто. Не уверен, что он будет соответствовать вашим требованиям к скорости.
Игнорирование части Excel (которая, по вашим словам, не важна):
Я обнаружил, что LINQ довольно полезен при разборе текстовых файлов (с разделителями по каналам или csv).
например ,При этом считывается файл с разделителями по каналу, пропускающий строку hader, и в результате создается IEnumerable:
переменные записи = из строки в файле.Прочитайте все строки (@"c:\blah.txt").Пропустите (1) пусть части = строка.Разделить ('|') выберите части;
Если файлы относительно небольшие, вы можете использовать Файл класс.В нем есть следующие методы, которые могут вам помочь:
- Прочитанные байты
- Строки чтения
- Прочитанный текст
Ваш вопрос немного расплывчатый. Я предполагаю, что текстовые файлы содержат структурированные данные, а не только случайные строки текста. Р>
Если вы анализируете файлы самостоятельно, в .NET есть функция библиотеки для чтения всех строк из текстового файла в массив строк (File.ReadAllLines). Если вы знаете, что ваши файлы достаточно малы для хранения в памяти, вы можете использовать этот метод и выполнять итерации по массиву с помощью регулярного выражения для проверки & amp; извлечь поля.
Файлы Excel - это другая игра с мячом. Файлы .XLS являются двоичными, а не текстовыми, поэтому для доступа к ним вам потребуется сторонняя библиотека. Файлы .XLSX из Excel 2007 содержат сжатые данные XML, поэтому вам снова нужно будет распаковать XML, а затем использовать анализатор XML для получения данных. Я бы не рекомендовал писать собственный XML-парсер, если только вы не чувствуете необходимость в интеллектуальных упражнениях.
Я согласен с Джоном,
Например: -
using System.IO;
...
public class Program {
public static void Main() {
foreach(string s in File.ReadAllLines(@"c:\foo\bar\something.txt") {
// Do something with each line...
}
}
}
Процесс чтения файлов не замедляется, если вы читаете все файлы одновременно, используя класс File и методы, предложенные John. В зависимости от размера файла и того, что вы хотите с ним делать, он может использовать больше или меньше памяти. Я бы посоветовал вам попробовать с File.ReadAllText (или с тем, что подходит для вас)
Что касается чтения файлов XLS:
Если у вас Microsoft Office XP и выше, у вас есть доступ к уже включенным библиотекам .NET SDK Office, где вы можете " родным образом " читать файлы XLS, Word, PPT и т. д. Обратите внимание, что в Office XP это необходимо проверять вручную во время установки (если только ранее не был установлен .NET). Р>
Я не знаю, доступны ли эти библиотеки как отдельный пакет, если у вас нет Microsoft Office. Р>
По какой-то непонятной причине все эти библиотеки (включая последние версии из Office 2007 -aka: Office 12) являются компонентами COM, которые мучают , вызывают уродливые зависимости и являются > не обратно совместим. И.Е .: Если у вас есть несколько методов, которые работают с Office XP (Office11), и вы устанавливаете их на клиента с Office 12, он не работает , потому что некоторые интерфейсы были изменены. Поэтому вам нужно поддерживать два набора " библиотек " и методы, чтобы справиться с этим. То же самое верно, если для программирования используются библиотеки Office 12, а у вашего клиента есть Office 11. Ваши библиотеки не работают. : S р>
Я не знаю, почему Microsoft никогда не создавала управляемую библиотеку Microsoft.Office.XXXX (обертку) для этих уродливых вещей. Р>
В любом случае, ваш вопрос довольно странный, попробуйте следовать некоторым советам здесь. Удачи!
Текстовый драйвер ODBC теперь устарел - он не поддерживает Unicode.
Удивительно, но MS Excel по-прежнему использует его, поэтому, если вы откроете Unicode CSV в Excel 2007 (а не импортируете его), вы потеряете все символы, не входящие в ASCII.
Лучше всего использовать методы чтения файлов .Net, как предлагали другие.