1

sqlデータベースに.csvファイルをインポートしています。TextFieldParserを使用しています。

私のコードは

TextFieldParser parser = new TextFieldParser(file); 
//single file 
//TextFieldParser parser = new TextFieldParser(CSVFolderPath + "\\" + file); 
parser.TextFieldType = FieldType.Delimited; 
parser.SetDelimiters(","); 
int k = 0; 
while (!parser.EndOfData) 
{ 
    //Processing row 
    string[] fields = parser.ReadFields(); 
    if (k != 0) 
    { 
        for (int i = 0; i < fields.Length; i++) 
        { 
            stationcode = fields[0].ToString().Substring(4, 5); 
            //if (fields[1].ToString().Substring(14, 8) == date) 
            //{ 
            if (i == 0) 
            { 

                dr = workTable.NewRow(); 
                dr[i] = fields[i].Substring(0, fields[i].Length - 4);  

            } 
            else if (i == 3) 
            { 
                dr[i] = Convert.ToDateTime(fields[i].ToString()); 
            } 
            else if (i == 4) 
            { 
                dr[i] = Convert.ToDateTime(fields[i].ToString()); 
            } 
            else if (i == 5) 
            { 
                dr[i] = Convert.ToInt32(fields[i].ToString()); 
            } 
            else 
                dr[i] = fields[i].ToString(); 
            if (i == 5) 
            { 
                workTable.Rows.Add(dr); 
            } 
            //} 

        } 
    } 
    k = k + 1; 
} 
parser.Close();     

ここでの作業テーブルはDataTableです。

ファイルを正常に解析するコード。

しかし、私のcsvファイルでは、最後の行が要約に使用されています。いくつかのフィールドの合計。

datatableに挿入するためにその行を含めたくありません。

これどうやってするの ?

4

3 に答える 3

0

メモリスペースが問題にならない場合。最初にCSV行のリストをロードし、各行を解析して最後を保存します。それ以外の場合は、要約行を識別する何らかの方法が必要です。(日付などのnullデータなど)パーサーにその行を無視するように通知できます。

インポートするデータを処理する最良の方法は、インポートファイルにインポートするデータのみが含まれるようにすることです。(ヘッダーや要約などはありません。)残念ながら、多くの企業は実際のエクスポートファイルの代わりにレポートをインポートしようとしています。

于 2012-08-16T06:24:23.893 に答える
0

最後の行が特定の文字列(サンプルの場合は「Summary」)で始まる場合は、TextFieldParserクラスのCommentTokensプロパティを使用できます。

参照: http: //msdn.microsoft.com/fr-fr/library/microsoft.visualbasic.fileio.textfieldparser.commenttokens (v = vs.110).aspx

そして: http: //geekswithblogs.net/brians/archive/2010/07/07/whats-a-nice-class-like-textfieldparser-doing-in-a-namespace.aspx

于 2014-02-07T10:48:58.077 に答える
0

サマリー行とメモリスペースを特定するために必要なさまざまなケースが問題である場合は、いつでも次のTextFieldParser.PeekChars(Int32)方法を使用できます。

カーソルを進めずに、指定した文字数を読み取ります。

備考欄:

numberOfChars値は、行の合計文字数よりも小さくする必要があります。そうでない場合、PeekCharsによって返される文字列は行の長さに切り捨てられます。

そのため:

TextFieldParser parser = new TextFieldParser(file); 
//single file 
//TextFieldParser parser = new TextFieldParser(CSVFolderPath + "\\" + file); 
parser.TextFieldType = FieldType.Delimited; 
parser.SetDelimiters(","); 
int k = 0; 
while (!parser.EndOfData) 
{ 
    //Processing row 
    string[] fields = parser.ReadFields();

    //Peek if this is the last line, then break
    if (parser.PeekChars(Int32.MaxValue) is "") break;

    if (k != 0) 
    { 
...

docs.microsoftリンク

于 2019-08-28T18:47:18.470 に答える