【发布时间】:2016-05-31 16:54:32
【问题描述】:
我有一个文件,我将其流式传输到列表对象中以保存到数据库中的临时文件中,因为我必须使用临时表中的数据连接到其他表以获得最终结果,然后将此最终结果导出到.csv 文件。
一切正常,除了原始文件的流读取。
文件以逗号分隔,结构非常明确,结构永远不会改变。
我的问题是这样的:
“AccountHolder”字段在组成字符串的字符之间有一个逗号,因此我的 FileStream 将其视为分隔符。如何在不破坏 FileStream 必须遵守的逗号分隔符的情况下替换 AccountHolder 字符串中的逗号?
List<object[]> fileContent = new List<object[]>();
using (FileStream reader = File.OpenRead(ofd.FileName))
using (TextFieldParser parser = new TextFieldParser(reader))
{
parser.TrimWhiteSpace = true;
parser.Delimiters = new[] { "," };
parser.HasFieldsEnclosedInQuotes = true;
while (!parser.EndOfData)
{
object[] line = parser.ReadFields();
fileContent.Add(line);
lstRegNo.Add(line[0].ToString().Trim());
lstAccHolder.Add(line[1].ToString().Trim().Replace(',', ' '));
lstAmount.Add(line[2].ToString().Trim().Replace(',', ' '));
lstAccNo.Add(line[3].ToString().Trim());
lstBranch.Add(line[4].ToString().Trim());
lstDate.Add(line[5].ToString().Trim());
lstCode.Add(line[6].ToString().Trim());
lstOrphenColumn.Add(line[7].ToString().Trim());
}
这是我正在流式传输的文件的示例:
000001,A WHATEVER,00000000001,0000000000001,000001,160510,17,0
000002,B WHATEVER,00000000002,0000000000002,000002,160510,17,0
000003,C, WHATEVER,00000000003,0000000000003,000003,160510,17,0
000004,D WHATEVER,00000000004,0000000000004,000004,160510,17,0
000005,E WHATEVER,00000000005,0000000000005,000005,160510,17,0
如您所见,在第 3 行,AccountHolder 的名称中有一个逗号。我需要它的值是“C WHATEVER”,而不是“C, WHATEVER” 我想消除那个逗号,但仍然能够将文件流式传输到我的列表中对象用逗号分隔文件中的字段。
请注意,每次我收到文件的数据都会有所不同,因此仅寻找静态值不会削减它。
我该怎么做?
【问题讨论】:
-
要解决此问题,您可以使用唯一分隔符(例如
;)或将文本放入""(quote 它们 - 必须嵌入逗号或双引号字符的字段被引用”)。 -
提供 CSV 文件的人违反了 CSV 文件的规则,您应该要求他们按照@Sinatr 的说明进行操作。可以围绕此类事故进行编码,但请考虑您可能遇到的所有可能问题。你加入了哪些专栏?如果多余的逗号出现在第 7 列而不是第 2 列会怎样?目前很难解决
-
@Sinatr:不确定他是否可以更改输入文件(将字段用双引号括起来)
-
那么 CSV 提供者有责任修复 @Veverke,很难确定逗号应该在 CSV 文件中的哪个位置,并且在编程上非常困难
-
这看起来像是人类输入的。人类可能会犯许多不同类型的打字错误,并且很难编写一个通用程序来查找并修复所有可能的人为错误。