c# - 替换逗号分隔文件中的特定逗号

标签 c# csv

我有一个文件,我将其流式传输到列表对象中以保存到数据库中的临时表中,因为我必须使用临时表中的数据连接到其他表以获得最终结果,然后将此最终结果导出到.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”我想消除该逗号,但仍然能够将文件流式传输到我的列表中对象用逗号分隔文件中的字段。

请注意,每次收到文件时,文件的数据都会有所不同,因此仅查找静态值是不够的。

我该怎么做?

最佳答案

好吧...如果字段已修复,那么您就没有正确设置解析器。它知道如何处理固定宽度字段,这与规范的 CSV 文件有些不同。

顺便说一句,我倾向于制作一些反射(reflect)“列”名称的常量:

//--> indexes into parsed line...
const int RegNo = 0;
const int AcctHolder = 2;
const int Amount = 4;
const int AcctNo = 6;
//--> ...etc.

using Microsoft.VisualBasic.FileIO;
//...
List<object[]> fileContent = new List<object[]>();
using (FileStream reader = File.OpenRead(ofd.FileName))
using (TextFieldParser parser = new TextFieldParser(reader))
{
  parser.TextFieldType = FieldType.FixedWidth;
  parser.SetFieldWidths
  (
     6  1, //--> width of RegNo, width of ignored comma
    10, 1, //--> width of AcctHolder, width of ignored comma
    10, 1, //--> width of Amount, width of ignored comma
    13, 1, //--> etc...
     6, 1, 
     6, 1, 
     2, 1,
     1
  );
  while (!parser.EndOfData)
  {
    object[] line = parser.ReadFields();
    fileContent.Add(line);
    lstRegNo.Add( line[ RegNo ].ToString( ));
    lstAccHolder.Add(line[ AcctHolder ].ToString().Replace(',', ' '));
    lstAmount.Add(line[ Amount ].ToString().Trim().Replace(',', ' '));
    lstAccNo.Add(line[ AcctNo ].ToString().Trim());
    //--> etc...
  }
}

有关更多信息,请查看this出来。

关于c# - 替换逗号分隔文件中的特定逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37525159/

相关文章:

c# - 从调试中排除类

C#:如何在 Visual Studio 中查找对特定类的等于运算符的引用

csv - 如何使用 Pharo 查找目录中的所有 .csv 文件?

mysql - LOAD DATA LOCAL INFILE 给出错误 The used command is not allowed with this MySQL version

c# - 跳过 WebBrowser 控件中的 "Download file"对话框

c# - C# 中的 IANA/Olson 时区支持

c# - 每次单击按钮时如何在不同列的一行中添加数据

python - 带有自定义引用的 Python 中的 csv 编写器

javascript - Angular.js 从 json 数据生成 csv 文件

python - csv Python 中的单独列