Альтернативы для расширенного чтения и синтаксического анализа текстовых файлов с использованием .NET

StackOverflow https://stackoverflow.com/questions/34182

  •  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, как предлагали другие.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top