如何防止解析特定的逗号分隔值(C#)

时间:2011-09-29 16:33:58

标签: c# .net excel csv

  

可能重复:
  Dealing with commas in a CSV file

我目前正在从CSV文件中解析值并将它们添加到数据表中。

csv文件包含5列,在将每行添加到数据表之前解析每一行。

解析csv后,数据表可以显示如下:

|  Town/City  | Cost |
| Birmingham  | 400  |
| Manchester  | 500  |

对于这些数据,没有问题。但是,我有一些如下所示的值:

|  Town/City    | Cost |
|  London, West | 800  |

由于一列的值之间有逗号,因此显然将其解析为单独的列。

数据无法更改,因此我需要一种方法将其解析为单列而不是两列。

到目前为止,这是我的代码,用于解析有5列的行。我已经评论了我想新代码需要去的地方。

        //parse csv file and return as data table
    public System.Data.DataTable GetCsvData()
    {
        string strLine;
        char[] charArray = new char[] { ',' };

        List<string> strList = new List<string>();

        System.Data.DataTable dt = new System.Data.DataTable("csvData");
        System.IO.FileStream fileStream = null;
        System.IO.StreamReader streamReader = null;

        if (!string.IsNullOrEmpty(csvFilePath))
        {
            fileStream = new System.IO.FileStream(csvFilePath, System.IO.FileMode.Open);
            streamReader = new System.IO.StreamReader(fileStream);

            strLine = streamReader.ReadLine();

            strList = strLine.Split(charArray).ToList();

            //only add first 5 columns
            for (int i = 0; i <= 4; i++)
                dt.Columns.Add(strList[i].Trim());

            strLine = streamReader.ReadLine();

            while (strLine != null)
            {
                strList = strLine.Split(charArray).ToList();

                System.Data.DataRow dataRow = dt.NewRow();

                /*THIS CODE PARSES THE ROW'S 5 COLUMNS AND NEEDS TO PARSE COMMA
                SEPERATED VALUES AS A SINGLE VALUE*/
                for (int i = 0; i <= 4; i++)
                    dataRow[i] = strList[i].Trim();

                dt.Rows.Add(dataRow);

                strLine = streamReader.ReadLine();
            }

            streamReader.Close();
            return dt;
        }

        return null;
    }

任何对此的帮助都会非常感激,因为我正努力在谷歌上找到答案。

2 个答案:

答案 0 :(得分:1)

我建议在拆分后检查数组。如果您发现它有N + 1列(您希望N在哪里),请合并两个City列并将其他列向下移动(strList [i] = strList [i + 1])。否则正常处理。

当然,这仅适用于只有一个具有潜在逗号的列。

答案 1 :(得分:1)

除了检查@Bahri建议的拆分数组的长度外,如果您的数据足够可预测(如您的示例所示),则可以检查列内容。

如果示例中的成本始终是一个数字,您可以检查它是否只包含数字(或使用正则表达式进行更复杂的匹配)。如果没有,则折叠前两列。