Альтернативы для расширенного чтения и анализа текстовых файлов с использованием .NET - PullRequest
3 голосов
/ 29 августа 2008

Мне нужно читать из различных текстовых файлов (у меня есть несколько файлов с разделителями и некоторые файлы фиксированной ширины). Я рассмотрел разбор файлов построчно (медленно с использованием методов типа File.ReadLine) и чтение файла с помощью текстового драйвера ODBC (быстрее), но есть ли у кого-нибудь еще (лучше) предложения? Я использую .NET / C #.

Ответы [ 9 ]

5 голосов
/ 29 августа 2008

Я не уверен, что вы действительно могли бы выполнить анализатор текста и Excel, если только под файлом Excel вы не подразумеваете файл с разделителями-запятыми / трубой / табуляцией, который на самом деле является просто другим текстовым файлом. Чтение реальных файлов Excel требует использования библиотек MS Office.

Для разбора текстового файла с разделителями, вы можете посмотреть FileHelpers - с открытым исходным кодом, и они в значительной степени покрывают его. Не уверен, что он будет соответствовать вашим требованиям к скорости.

3 голосов
/ 11 сентября 2008

Отвечая на мой вопрос:

В итоге я использовал объект Microsoft.VisualBasic.FileIO.TextFieldParser, см.

http://msdn.microsoft.com/en-us/library/f68t4563.aspx

(пример реализации здесь)

Это позволяет мне обрабатывать CSV-файлы, не беспокоясь о том, как справиться с тем, заключены ли поля в кавычки, содержат ли они запятые, экранированные кавычки и т. Д.

3 голосов
/ 29 августа 2008

Игнорирование части Excel (которую, как вы говорите, не важно):

Я обнаружил, что LINQ довольно полезен при разборе txt-файлов (с разделителями каналов или csv)

например. Это читает файл с разделителем канала, пропуская строку хадера, и в результате создает IEnumerable:

var records = из строки в File.ReadAllLines (@ "c: \ blah.txt"). Пропустить (1) let parts = line.Split ('|') выберите детали;

1 голос
/ 29 августа 2008

Я согласен с Джоном,

Например: -

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...
    }
  }
}
1 голос
/ 29 августа 2008

Ваш вопрос немного расплывчатый. Я предполагаю, что текстовые файлы содержат структурированные данные, а не только случайные строки текста.

Если вы анализируете файлы самостоятельно, тогда в .NET есть библиотечная функция для чтения всех строк из текстового файла в массив строк (File.ReadAllLines). Если вы знаете, что ваши файлы достаточно малы для хранения в памяти, вы можете использовать этот метод и выполнять итерации по массиву с помощью регулярного выражения для проверки и извлечения полей.

Файлы Excel - это другая игра с мячом. Файлы .XLS являются двоичными, а не текстовыми, поэтому для доступа к ним вам потребуется сторонняя библиотека. Файлы .XLSX из Excel 2007 содержат сжатые данные XML, поэтому вам снова нужно будет распаковать XML, а затем использовать анализатор XML для получения данных. Я бы не советовал писать собственный XML-парсер, если только вы не чувствуете необходимость в интеллектуальных упражнениях.

1 голос
/ 29 августа 2008

Если файлы относительно небольшие, вы можете использовать класс File . У него есть следующие методы, которые могут вам помочь:

  • ReadAllBytes
  • ReadAllLines
  • ReadAllText
0 голосов
/ 29 августа 2008

Текстовый драйвер ODBC теперь довольно устарел - он не поддерживает Unicode.

Удивительно, но MS Excel по-прежнему использует его, поэтому, если вы откроете Unicode CSV в Excel 2007 (а не импортируете его), вы потеряете все символы не ASCII.

Лучше всего использовать методы чтения файлов .Net, как предлагали другие.

0 голосов
/ 29 августа 2008

Относительно чтения файлов 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 (обертку) для этих уродливых вещей.

В любом случае, ваш вопрос довольно странный, попробуйте следовать некоторым советам здесь. Удачи!

0 голосов
/ 29 августа 2008

Процесс чтения файла не будет медленным, если вы прочитаете все файлы одновременно, используя класс File и методы, предложенные John. В зависимости от размера файла и того, что вы хотите с ним делать, он может использовать больше или меньше памяти. Я бы посоветовал вам попробовать с File.ReadAllText (или с тем, что подходит для вас)

...