.NET を使用してテキスト ファイルの読み取りと解析を強化するための代替手段

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

  •  09-06-2019
  •  | 
  •  

質問

さまざまなテキスト ファイルから読み取る必要があります (区切りファイルと固定幅ファイルがあります)。ファイルを 1 行ずつ解析し (File.ReadLine タイプのメソッドを使用すると遅い)、ODBC テキスト ドライバーを使用してファイルを読み取る (高速) ことを検討しましたが、他に (より良い) 提案がある人はいますか?.NET/C#を使用しています。

役に立ちましたか?

解決 3

私自身の質問に答えると、次のようになります。

最終的には Microsoft.VisualBasic.FileIO.TextFieldParser オブジェクトを使用しました。以下を参照してください。

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

(実装例はこちら)

これにより、フィールドが引用符で囲まれているか、カンマが含まれているか、引用符がエスケープされているかなどの対処方法を気にせずに CSV ファイルを処理できるようになります。

他のヒント

Excel ファイルとはカンマ/パイプ/タブで区切られたファイル (実際には単なるテキスト ファイル) を意味するのでない限り、テキストと Excel のファイル パーサーを実際に実行できるかどうかはわかりません。実際の Excel ファイルを読み取るには、MS Office ライブラリを使用する必要があります。

区切り文字で区切られたテキスト ファイルの解析については、次のことを調べてください。 ファイルヘルパー -- オープンソースであり、ほぼカバーされています。ただし、速度要件を満たしているかどうかはわかりません。

Excel の部分は無視します (これは重要ではないと言います)。

LINQ は txt ファイル (パイプ区切りまたは csv) を解析するのにかなり便利であることがわかりました。

例えばこれは、hader 行をスキップしてパイプ区切りのファイルを読み取り、結果として IEnumerable を作成します。

var レコード = File.ReadAllLines(@"c:\blah.txt")の行から。スキップ(1) パーツ=ラインとします。分割('|') 部品を選択します。

ファイルが比較的小さい場合は、 ファイル クラス。次のような役立つメソッドがあります。

  • すべてのバイトを読み取る
  • すべての行を読む
  • すべてのテキストを読む

あなたの質問は少し曖昧です。テキスト ファイルには、単なるランダムなテキスト行ではなく、構造化データが含まれていると思います。

ファイルを自分で解析する場合、.NET にはテキスト ファイルのすべての行を文字列の配列に読み取るライブラリ関数 (File.ReadAllLines) があります。ファイルがメモリに保持できるほど小さいことがわかっている場合は、この方法を使用し、正規表現を使用して配列を反復処理し、フィールドを検証して抽出できます。

Excel ファイルは別の競技です。.XLS ファイルはテキストではなくバイナリであるため、アクセスするにはサードパーティのライブラリを使用する必要があります。Excel 2007 の .XLSX ファイルには圧縮された 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 の最新バージョンを含む、別名:Office 12) は、 痛み 使用すると醜い依存関係が発生し、 ない 下位互換性があります。つまり:Office XP (Office11) で動作するメソッドがいくつかあり、それを Office 12 を使用している顧客にインストールすると、 機能しない, いくつかのインターフェイスが変更されたためです。したがって、メンテナンスする必要があります 「ライブラリ」のセットとそれに対処するメソッド。Office 12 ライブラリを使用してプログラミングし、顧客が Office 11 を使用している場合にも同じことが当てはまります。あなたのライブラリは機能しません。:S

なぜ Microsoft がこれらの醜いものを囲む Microsoft.Office.XXXX マネージ ライブラリ (ラッパー) を作成しなかったのかわかりません。

とにかく、あなたの質問はかなり奇妙です、ここでいくつかのアドバイスに従ってみてください。幸運を!

ODBC テキスト ドライバーはかなり時代遅れになっており、Unicode をサポートしていません。

驚くべきことに、MS Excel は今でもそれを使用しています。 開ける Excel 2007 で Unicode CSV をインポートすると、非 ASCII 文字がすべて失われます。

他の人が提案しているように、.Net のファイル読み取りメソッドを使用するのが最善です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top