某些单元格的文本中包含分隔符
Delimiter concluded in text in some cells
我正在制作一个必须从 CSV 文件中读取大量数据的软件。 CSV 文件使用“;”作为分隔符。最近发现有些单元格的文字也以';'结尾。文件中的每个元组都是一个对象,因此该行中的每个单元格都是该对象的一个属性。我在 C# 中使用方法 Split,它 returns 一个字符串数组。因为 ';'在某些单元格中,我收到错误消息:数组超出范围。有没有一些方法可以在不删除“;”的情况下摆脱这个错误来自某些细胞?
此类元组的示例:
单元格 1;单元格 2;单元格 3;静止单元格 3;单元格 4;
Cell3;stillCell3 是一个单元格,但 Split 方法不知道。
您可以通过将字段嵌入一组双引号内来转义这些值。更多详情可以参考这个link
------------编辑 1 --------------------
考虑这个例子。是逗号分隔csv
在这里您可以看到一个包含“,”和“;”的列 "OK,123;asw.wew"
如果用记事本或者文本编辑器打开可以看到自动添加了转义符
您必须以这样一种方式进行编码,即它会在分隔符而不是双引号内拆分。
------------------------ 编辑 2 ---------- --------------
你可以利用.net
classTextFieldParser
。使用它
- 添加对
Microsoft.VisualBasic
的引用(是的,它说的是 VisualBasic,但它也适用于 C#)
- 使用
Microsoft.VisualBasic.FileIO.TextFieldParser
class解析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文件格式的要求。没有解析器可以处理人类会挠头的问题。
您不能解析不明确的值。您必须在字段值中转义分隔符,或者必须将值放在双引号之间。
我正在制作一个必须从 CSV 文件中读取大量数据的软件。 CSV 文件使用“;”作为分隔符。最近发现有些单元格的文字也以';'结尾。文件中的每个元组都是一个对象,因此该行中的每个单元格都是该对象的一个属性。我在 C# 中使用方法 Split,它 returns 一个字符串数组。因为 ';'在某些单元格中,我收到错误消息:数组超出范围。有没有一些方法可以在不删除“;”的情况下摆脱这个错误来自某些细胞?
此类元组的示例:
单元格 1;单元格 2;单元格 3;静止单元格 3;单元格 4;
Cell3;stillCell3 是一个单元格,但 Split 方法不知道。
您可以通过将字段嵌入一组双引号内来转义这些值。更多详情可以参考这个link
------------编辑 1 --------------------
考虑这个例子。是逗号分隔csv
在这里您可以看到一个包含“,”和“;”的列 "OK,123;asw.wew"
如果用记事本或者文本编辑器打开可以看到自动添加了转义符
您必须以这样一种方式进行编码,即它会在分隔符而不是双引号内拆分。
------------------------ 编辑 2 ---------- --------------
你可以利用.net
classTextFieldParser
。使用它
- 添加对
Microsoft.VisualBasic
的引用(是的,它说的是 VisualBasic,但它也适用于 C#) - 使用
Microsoft.VisualBasic.FileIO.TextFieldParser
class解析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文件格式的要求。没有解析器可以处理人类会挠头的问题。
您不能解析不明确的值。您必须在字段值中转义分隔符,或者必须将值放在双引号之间。