0

ディスクから読み取るcsvファイルがあります。列の数または列の名前を前もって知りません。
フィールドをどのように表現すべきかについての考え。理想的には、次のようなことを言いたいです。

文字列 Val = DataStructure.GetValue(i,ColumnName)。
ここで、i は i 番目の行です。

余談ですが、TextFieldParser クラス
http://msdn.microsoft.com/en-us/library/cakac7e6(v=vs.90).aspxを使用して解析します。

4

3 に答える 3

4

andプロパティDataTableを持つが必要であるかのように聞こえます。RowsColumns

したがって、次のように言えます。

string Val = table.Rows[i].Field<string>(ColumnName);

ADataTableはメモリ内データのテーブルです。メソッドで提案されているように、厳密に型指定して使用できますFieldが、実際にはデータをオブジェクトとして内部的に保存します。

このパーサーを使用して、csv を DataTable に変換できます。

編集:私はあなたがTextFieldParser. csv を a に変換する簡単な方法を次に示しDataTableます。

var table = new DataTable();
using (var parser = new TextFieldParser(File.OpenRead(path)))
{
    parser.Delimiters = new[]{","};
    parser.HasFieldsEnclosedInQuotes = true;
    // load DataColumns from first line 
    String[] headers = parser.ReadFields();
    foreach(var h in headers)
            table.Columns.Add(h);
    // load all other lines as data '
    String[] fields;
    while ((fields = parser.ReadFields()) != null)
    {
        table.Rows.Add().ItemArray = fields;
    }
}
于 2012-10-17T10:08:23.253 に答える
0

必要に応じて csv パーサーを使用しますが、カスタマイズが必要な場合はテキスト パーサーを使用すると非常に簡単に行うことができます。

必要に応じて、1 つ (または複数) の辞書を使用します。PropertyString --> 列インデックスを持つ少なくとも 1 つ。必要に応じて、逆の 1 列のインデックス--> PropertyString を使用することもできます。

csv のファイルを解析するときは、通常、解析中に結果をリストに入れ、速度上の理由で完了したら配列に入れます (List.ToArray())。

于 2012-10-17T10:08:13.303 に答える
0

列名が最初の行にある場合は、それを読み取りDictionary<string, int>、列名を列インデックスにマップする に格納します。

次に、残りの行を のような単純な構造に格納できますList<string[]>
行の列を取得するにはcsv[rowIndex][nameToIndex[ColumnName]];

nameToIndex[ColumnName]名前から列インデックスをcsv[rowIndex]取得し、必要な行 (文字列配列) を取得します。

もちろん、これはクラスにラップできます。

于 2012-10-17T10:07:32.893 に答える