C# 在某些单元格中以文本结尾的分隔符

C# 在某些单元格中以文本结尾的分隔符,c#,csv,delimiter,import-csv,C#,Csv,Delimiter,Import Csv,我正在制作一个软件,它必须从CSV文件中读取大量数据。CSV文件使用“;”作为分隔符。最近我发现一些单元格中的文本也以“;”结尾。文件中的每个元组都是一个对象,因此此行中的每个单元格都是该对象的属性。我使用C#中的Split方法,它返回一个字符串数组。因为“;”在某些单元格中,我得到一个错误:数组超出了界限。是否有一些方法可以在不删除“;”的情况下消除此错误从一些细胞里 此类元组的示例: 细胞1;细胞2;细胞3;stillCell3;细胞4 细胞3;stillCell3是一个单元格,但Split

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

此类元组的示例:

细胞1;细胞2;细胞3;stillCell3;细胞4


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

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

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

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

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

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

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

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

您可以利用
.net
TextFieldParser
来使用它

  • 添加对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
        }
    }
}
以下是一些更有用的链接:


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

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

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

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

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

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

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

您可以利用
.net
TextFieldParser
来使用它

  • 添加对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
        }
    }
}
以下是一些更有用的链接:

您可以尝试,它有许多选项来读取字段

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();
}
使用(TextFieldParser lcsvReader=newtextfieldparser(newmemorystream(),Encoding.Default))
{
lcsvReader.Delimiters=新字符串[2]{“,”,“\t”};
lcsvReader.HasFieldsEnclosedInQuotes=true;
lcsvReader.TrimWhiteSpace=true;
而(!lcsvReader.EndOfData)
{
string[]fields=lcsvReader.ReadFields();
//字段--CSV中的实际字段
}
lcsvReader.Close();
}
您可以尝试,它有许多选项来读取字段

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();
}
使用(TextFieldParser lcsvReader=newtextfieldparser(newmemorystream(),Encoding.Default))
{
lcsvReader.Delimiters=新字符串[2]{“,”,“\t”};
lcsvReader.HasFieldsEnclosedInQuotes=true;
lcsvReader.TrimWhiteSpace=true;
而(!lcsvReader.EndOfData)
{
string[]fields=lcsvReader.ReadFields();
//字段--CSV中的实际字段
}
lcsvReader.Close();
}

您的原始数据不符合CSV文件格式的要求。没有一个解析器能够处理人们会挠头的问题


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

您的原始数据不符合CSV文件格式的要求。没有一个解析器能够处理人们会挠头的问题


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

如果你能提供一份报告,那就太棒了。小心重新发明轮子的用途。你能发布一些数据吗?根据你的描述,听起来好像只有多个“;”这一行很容易处理,但你的例子不可能处理。@MineR不,这是我的公司的数据,没有程序化的方法来完成你的要求。你必须手动清理你的数据。如果你能提供一个新的解决方案,那将是非常棒的。要非常小心重新发明轮子的使用-你能发布一些数据吗?根据你的描述,听起来好像只有多个“;”这一行很容易处理,但你的例子不可能处理。@MineR不,这是我的公司的数据,没有程序化的方法来完成你的要求。您必须手动清理数据。@user10024569检查编辑。在文本编辑器中打开您的
.csv
,如果可能,请共享数据。csv文件有大约1000行我必须更改。在我的情况下,当我在excel中编辑单元格时,它会自动包含双引号。您可以通过在文本编辑器中打开csv来检查csv吗notepad@user10024569检查编辑。在文本编辑器中打开您的
.csv
,如果可能,请共享数据。csv文件有大约1000行我必须更改。在我的情况下,当我在excel中编辑单元格时,它会自动包含双引号。您可以通过在文本编辑器(如记事本)中打开csv来检查csv吗