某些单元格的文本中包含分隔符

Delimiter concluded in text in some cells

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

此类元组的示例:

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

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

您可以通过将字段嵌入一组双引号内来转义这些值。更多详情可以参考这个link

CSV File Format

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

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

在这里您可以看到一个包含“,”和“;”的列 "OK,123;asw.wew"

如果用记事本或者文本编辑器打开可以看到自动添加了转义符

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

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

你可以利用.netclassTextFieldParser。使用它

  • 添加对 Microsoft.VisualBasic 的引用(是的,它说的是 VisualBasic,但它也适用于 C#)
  • 使用Microsoft.VisualBasic.FileIO.TextFieldParserclass解析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
        }
    }
}

这里有一些更有用的link:

你可以试试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();
}

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

您不能解析不明确的值。您必须在字段值中转义分隔符,或者必须将值放在双引号之间。