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