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

时间:2016-05-30 11:59:56

标签: c# csv

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

请注意,每次收到文件的数据都会有所不同,因此只需查找静态值就不会削减它。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

嗯...如果字段是固定的,那么你没有正确设置你的解析器。它知道如何处理固定宽度的字段,这与规范的CSV文件有些不同。

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

//--> 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

答案 1 :(得分:1)

一个想法是,无论何时读一行,都要计算逗号的数量。因此,假设您的列数始终为7.下面的代码将捕获第二列上的所有额外逗号。

    string filename="sample.csv";
    var stream=new StreamReader(filename);
    string l=null;

    while((l = stream.ReadLine())!=null)
    {
        var ss=l.Split(',');
        int count = ss.Length - 1;//number of commas found
        int extraCommas = count - 7;

        var regNo = ss[0];
        StringBuilder accHolder = new StringBuilder();

        //loops from 1 and captures x number of extra commas
        for (int x = 1; x <= extraCommas+1; x++)
        {
            accHolder.Append(ss[x]);
        }

        var amount = ss[2 + extraCommas];
        var accNo = ss[3 + extraCommas];
        var branch = ss[4 + extraCommas];
        var date = ss[5 + extraCommas];   
        //etc....             
    }

答案 2 :(得分:0)

最终我做的是以下内容:

ERROR [solr.tracker.AbstractTracker] [SolrTrackerScheduler_Worker-11] Tracking failed
org.alfresco.error.AlfrescoRuntimeException: 04310291 api/solr/aclchangesets return status:404

这似乎适用于我目前导入的每个文件。

感谢你的所有建议!