4

CSV をデータテーブルに読み込もうとしています。

CSV には数百の列があり、最大 20 行しかない場合があります。

次のようになります。

+----------+-----------------+-------------+---------+---+
|  email1  |     email2      |   email3    | email4  | … |
+----------+-----------------+-------------+---------+---+
| ccemail1 | anotherccemail1 | 3rdccemail1 | ccemail |   |
| ccemail2 | anotherccemail2 | 3rdccemail2 |         |   |
| ccemail3 | anotherccemail3 |             |         |   |
| ccemail4 | anotherccemail4 |             |         |   |
| ccemail5 |                 |             |         |   |
| ccemail6 |                 |             |         |   |
| ccemail7 |                 |             |         |   |
| …        |                 |             |         |   |
+----------+-----------------+-------------+---------+---+

これにはgenericparserを使用しようとしています。ただし、列名を知っている必要があると思います。

string strID, strName, strStatus;
using (GenericParser parser = new GenericParser())
{
    parser.SetDataSource("MyData.txt");

    parser.ColumnDelimiter = "\t".ToCharArray();
    parser.FirstRowHasHeader = true;
    parser.SkipStartingDataRows = 10;
    parser.MaxBufferSize = 4096;
    parser.MaxRows = 500;
    parser.TextQualifier = '\"';

    while (parser.Read())
    {
      strID = parser["ID"];  //as you can see this requires you to know the column names
      strName = parser["Name"];
      strStatus = parser["Status"];

      // Your code here ...
    }
}

列名を知らなくても、このファイルをデータテーブルに読み込む方法はありますか?

4

4 に答える 4

7

とても簡単です!

        var adapter = new GenericParsing.GenericParserAdapter(filepath);
        DataTable dt = adapter.GetDataTable();

これにより、すべてが自動的に行われます。

于 2012-07-19T22:06:58.623 に答える
2

ソースコードを見てみましたが、このように列インデックスでもデータにアクセスできます

var firstColumn = parser[0]

0を列番号に置き換えます。カラムの数は、を使用して見つけることができます

parser.ColumnCount
于 2012-07-19T21:48:35.783 に答える
2

私はそれに慣れていないので、 、または thisGenericParserのようなツールを使用することをお勧めします。TextFieldParserFileHelpersCSV-Reader

ただし、この単純な手動アプローチも機能するはずです。

IEnumerable<String> lines = File.ReadAllLines(filePath);
String header = lines.First();
var headers = header.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries);
DataTable tbl = new DataTable();
for (int i = 0; i < headers.Length; i++)
{
    tbl.Columns.Add(headers[i]);
}
var data = lines.Skip(1);
foreach(var line in data)
{
    var fields = line.Split(new[]{','}, StringSplitOptions.RemoveEmptyEntries);
    DataRow newRow = tbl.Rows.Add();
    newRow.ItemArray = fields;
}
于 2012-07-19T22:01:45.817 に答える