9

約100,000行、1行あたり約50列のテキストファイルがあり、ほとんどのデータはかなり小さいです(5〜10文字または数字)。

これは非常に単純なタスクですが、このデータをC#データ構造(たとえば、DataTable)にインポートするのに最適な方法は何か疑問に思っていますか?

4

6 に答える 6

9

タブ列区切り文字を含むCSVとして読み込みます。

高速CSVリーダー

編集:
これがあなたが必要とするものの最低限の例です:

DataTable dt = new DataTable();
using (CsvReader csv = new CsvReader(new StreamReader(CSV_FULLNAME), false, '\t')) {
    dt.Load(csv);
}

ここで、CSV_FULLNAMEは、タブ区切りのCSVのフルパス+ファイル名です。

于 2010-01-26T22:45:39.723 に答える
3

.NETの組み込みテキストパーサーを使用します。それは無料で、優れたエラー処理があり、多くの奇妙なボールケースを扱います。

http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.fileio.textfieldparser(VS.80).aspx

于 2010-01-26T23:07:40.343 に答える
1

FileHelpersについては、タブを区切り文字として定義できます。提供されたリンクを使用してそのサイトにアクセスし、覗いてみてください。

これがお役に立てば幸いです、よろしく、トム。

于 2010-01-26T22:59:58.983 に答える
0

2つのオプション:

  1. System.Data.OleDb名前空間のクラスを使用します。これには、ごくわずかなコードで要求したようにデータテーブルに直接読み込むという利点がありますが、カンマ区切りではなくタブであるため、正しく理解するのは難しい場合があります。
  2. csvパーサーを使用または記述します。String.Split()ベースのパーサーではなく、@JayRiggsがリンクされているようなステートマシンベースのパーサーであることを確認してください。これはOleDbメソッドよりも高速であるはずですが、データテーブルではなくリストまたは配列が提供されます。
于 2010-01-26T22:47:39.823 に答える
0

ただし、行を解析する場合は、データグリッドのデータソースとして、転送と巻き戻しをサポートするものを使用するようにしてください。最初にすべてをメモリにロードしたくないですか?次回はデータ量を10倍にしたらどうでしょうか。file.seekを使用するものを作成し、最初にすべてをメモリに読み込まないでください。それが私のアドバイスです。

于 2010-01-26T23:02:38.110 に答える
0

シンプルですが、必ずしも優れた方法ではありません。

  • テキストリーダーを使用してファイルを文字列に読み込む

  • String.Splitを使用して行を取得します

  • String.Splitをタブ文字とともに使用して、フィールド値を取得します

于 2010-01-26T23:05:49.273 に答える