【问题标题】:TextFieldParser with not parsing last lineTextFieldParser 不解析最后一行
【发布时间】:2012-08-16 05:46:39
【问题描述】:

我在我的 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 文件中,最后一行用于摘要。部分字段的总和。

我不想在数据表中插入该行。

我该怎么做?

【问题讨论】:

    标签: c# asp.net sql csv


    【解决方案1】:

    如果内存空间不是问题。首先加载 CSV 行列表,然后解析每一行保存最后一行。否则,您需要某种方式来识别汇总行。 (例如日期之类的空数据)可以指示解析器忽略该行。

    处理导入数据的最佳方法是尝试确定导入文件将仅包含要导入的数据。 (没有标题,没有摘要等。)不幸的是,很多公司尝试导入报告而不是实际的导出文件。

    【讨论】:

    • 谢谢,我已经放了一个忽略最后一行的信号来解析。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      如果您有许多不同的情况需要识别摘要行和内存空间是一个问题,您可以随时使用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 link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-09
        相关资源
        最近更新 更多