2

ここでこれについて何も見ていないことに驚いています(または見逃したかもしれません)。CSV ファイルを解析するときに、データのない行がある場合、どのように処理できますか? 私は空白行について話しているのではなく、たとえば次のような空の行について話している:

ID,Name,Quantity,Price
1,Stuff,2,5
2,Things,1,2.5
,,,
,,,
,,,

私は TextFieldParser を使用して、データ内のカンマや複数の区切り記号などを処理しています。私が考えた 2 つの解決策は、ReadFields の代わりに ReadLine を使用することですが、それでは TextFieldParser を使用する利点が失われると思います。コンマを別の方法で処理する必要があります。もう 1 つのオプションは、フィールドを反復処理し、すべてのフィールドが空の場合に行を削除することです。ここに私が持っているものがあります:

dttExcelTable = new DataTable();

using (TextFieldParser parser = new TextFieldParser(fileName))
{
    parser.Delimiters = new string[] { ",", "|" };

    string[] fields = parser.ReadFields();
    if (fields == null)
    {
       return null;
    }
    foreach (string columnHeader in fields)
    {
       dttExcelTable.Columns.Add(columnHeader);
    }

    while (true)
    {
        DataRow importedRow = dttExcelTable.NewRow();
        fields = parser.ReadFields();
        if (fields == null)
        {
            break;
        }
        for (int i = 0; i < fields.Length; i++)
        {
            importedRow[i] = fields[i];
        }

        foreach (var field in importedRow.ItemArray)
        {
            if (!string.IsNullOrEmpty(field.ToString()))
            {
                dttExcelTable.Rows.Add(importedRow);
                break;
            }
        }

    }
}
4

3 に答える 3

3

サードパーティの CSV リーダーを使用しないと、この方法でコードを変更できます

.....
DataRow importedRow = dttExcelTable.NewRow();
for (int i = 0; i < fields.Length; i++)
    importedRow[i] = fields[i];

if(!importedRow.ItemArray.All (ia => string.IsNullOrWhiteSpace(ia.ToString())))
     dttExcelTable.Rows.Add(importedRow);

All IEnumerable 拡張機能を使用すると、string.IsNullOrWhiteSpace を使用して ItemArray のすべての要素をチェックできます。戻り値が true の場合、空の文字列の配列があり、Add をスキップできます

于 2015-07-14T17:28:18.147 に答える
0

私が提供したものよりも良い解決策があるようには思えません。データテーブルに追加する前に、すべてのフィールドをループして、それらがすべて空かどうかを確認する必要があります。

私が見つけた他の唯一の解決策は、 TextFieldParser を使用しないことであるスティーブの答えです

于 2015-07-21T18:18:54.180 に答える
0

行内のカンマを何も置き換えずに、null かどうかをテストできます。

strTemp = s.Replace(",", "");

if (!String.IsNullOrEmpty(strTemp)) { /*code here */}

http://ideone.com/8wKOVD

于 2015-07-14T17:42:02.530 に答える