0

我正在制作一个必须从 CSV 文件中读取大量数据的软件。CSV 文件使用“;” 作为分隔符。最近我发现有些单元格中的文本也结束了';'。文件中的每个元组都是一个对象,因此该行中的每个单元格都是该对象的一个​​属性。我使用 C# 中的 Split 方法,它返回一个字符串数组。因为';' 在某些单元格中出现错误:数组超出范围。有没有一些方法可以在不删除“;”的情况下摆脱这个错误 来自一些细胞?

这种元组的示例:

单元格1;单元格2;单元格3;静止单元格3;单元格4;

Cell3;stillCell3 是一个单元格,但 Split 方法不知道这一点。

4

3 回答 3

5

您的原始数据不符合 CSV 文件格式的要求。没有解析器可以处理人类会摸不着头脑的问题。

您无法解析模棱两可的值。您必须在字段值中转义分隔符,或者必须将值放在双引号之间。

于 2018-07-03T04:56:39.043 回答
0

您可以通过将字段嵌入到一组双引号中来转义这些值。有关更多详细信息,您可以参考此链接

CSV 文件格式

------------编辑1 ---------

考虑这个例子。它是一个逗号分隔csv

在此处输入图像描述

在这里你可以看到一个列“OK,123;asw.wew”,带有','和';'

如果我们用记事本或文本编辑器打开它,我们可以看到它自动添加了转义字符。

在此处输入图像描述

您必须以这样一种方式进行编码,即它会在分隔符上而不是在双引号内进行拆分。

-------------------------- 编辑 2 ---------------------- ----

您可以利用.netTextFieldParser。使用它

  • 添加对的引用Microsoft.VisualBasic(是的,它说 VisualBasic,但它也适用于 C#)
  • 使用Microsoft.VisualBasic.FileIO.TextFieldParser类来解析CSV文件

这是示例代码:

using (TextFieldParser parser = new TextFieldParser(@"c:\test.csv"))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    while (!parser.EndOfData) 
    {
        //Processing row
        string[] fields = parser.ReadFields();
        foreach (string field in fields) 
        {
            //TODO: Process field
        }
    }
}

以下是一些更有用的链接:

于 2018-07-03T04:33:09.760 回答
-1

您可以尝试TextFieldParser它有很多选项来读取字段。

using (TextFieldParser lcsvReader = new TextFieldParser(new MemoryStream(<FILE_BYTES>), Encoding.Default))
{
    lcsvReader.Delimiters = new string[2] { ",", "\t" };
    lcsvReader.HasFieldsEnclosedInQuotes = true;
    lcsvReader.TrimWhiteSpace = true;
    while (!lcsvReader.EndOfData)
    {
        string[] fields = lcsvReader.ReadFields();
        //fields -- Actual field in CSV
    }
    lcsvReader.Close();
}
于 2018-07-03T04:51:57.410 回答