簡體   English   中英

不解析最后一行的TextFieldParser

[英]TextFieldParser with not parsing last line

我正在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文件中,最后一行用於摘要。 一些字段的總計。

我不想在數據表中插入該行。

我怎樣才能做到這一點 ?

如果內存空間不會成為問題。 首先加載CSV行列表,然后分析每行並保存最后一行。 否則,您需要某種方式來標識摘要行。 (例如,日期等數據為空),這可能表示解析器忽略該行。

處理導入數據的最佳方法是嘗試確定導入文件僅包含要導入的數據。 (沒有標題,沒有摘要等。)不幸的是,許多公司嘗試導入報表而不是實際的導出文件。

如果最后一行以某些特定的字符串(例如“ 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

如果在確定摘要行和內存空間方面有許多不同的情況是問題,則可以始終使用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 鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM