读取包含货币的逗号分隔的CSV

时间:2015-01-21 00:12:21

标签: c# csv streamreader

以下内容从逗号分隔的CSV文件中读取。

货币字段是每一行[2]中的第三个字段是问题。 我需要用逗号分割字段,但货币字段有时可能很大并且也有它们。

如何拆分包含货币的逗号分隔的csv文件。??

csv在每一行总是保持5个字段。

下面示例中的第一行有效但第二行会导致问题。

3,09:29 pm,€20.00,测试,测试

1,02:55 am,€10,000.00,测试,测试

StreamReader fileIn = new StreamReader(path);
        //Read the file
        while (!fileIn.EndOfStream)
        {
           String line = fileIn.ReadLine();
           String[] pieces = line.Split(',');

           csvComplete cEve = new csvComplete (pieces[0], pieces[1], pieces[2], pieces[3], pieces[4]);// assign to class cEve
           entries.Add(cEve);

        }

任何链接或建议都将不胜感激。

5 个答案:

答案 0 :(得分:2)

之前我遇到过类似的问题,然后转向Microsoft.VisualBasic.FileIO.TextFieldParser。在你的情况下,试试这个:

using(TextFieldParser parser = new TextFieldParser(new StreamReader(path)){
    parser.Delimiters = new string [] {","};

    while(true){
        String[] pieces = parser.ReadFields();
        if(pieces == null)
            break;

        csvComplete cEve = new csvComplete (pieces[0], pieces[1], pieces[2], pieces[3], pieces[4]);// assign to class cEve
        entries.Add(cEve);
    }
}

可以找到其他信息here

答案 1 :(得分:1)

这是一个黑客:

//Read the file
while (!fileIn.EndOfStream)
{
   String line = fileIn.ReadLine();
   String[] pieces = line.Split(',');
   if(pieces.length > 5){
       String[] newPieces = new String[5];
       newPieces[0] = pieces[0];
       newPieces[1] = pieces[1];
       String currency = "";
       for(int i = 2; i < pieces.length - 2; i++){
           if(i == pieces.length -3)
               currency += pieces[i];
           else{
               currency += pieces[i] + ",";
           }
       }
       newPieces[2] = currency;
       newPieces[3] = pieces[pieces.length-2];
       newPieces[4] = pieces[pieces.length-1];
       csvComplete cEve = new csvComplete (newPieces[0], newPieces[1], newPieces[2], newPieces[3], newPieces[4]);// assign to class cEve
       entries.Add(cEve);
   }
   else{
       csvComplete cEve = new csvComplete (pieces[0], pieces[1], pieces[2], pieces[3], pieces[4]);// assign to class cEve
       entries.Add(cEve);
   }

 }

这应该考虑更大的货币(数万亿欧元会有更多的逗号)。

希望这有帮助!

答案 2 :(得分:1)

蛮力:

        StreamReader fileIn = new StreamReader(path);
        //Read the file
        while (!fileIn.EndOfStream)
        {
           String line = fileIn.ReadLine();
           String[] pieces = line.Split(',');
           if (pieces.Length == 5)
           {
               // Exactly 5 fields.   
               csvComplete cEve = new csvComplete (pieces[0], pieces[1], pieces[2], pieces[3], pieces[4]);// assign to class cEve
           }
           else if (pieces.Length == 6)
           {
               // Exactly 6 fields. We'll assume fields 1 and 2 should combine for currency string.
               csvComplete cEve = new csvComplete (pieces[0], pieces[1] + "," + pieces[2], pieces[3], pieces[4], pieces[5], pieces[6]);// assign to class cEve
           }
           else
           {
               // ?
           }
           entries.Add(cEve);

        }

答案 3 :(得分:1)

如果行长度是动态的

我对这个问题的解决方案是实现寻找欧元符号的逻辑&#34;&#34;在阵列的一个成员和一个基数&#34;。#34;在随后的成员中。如果满足这个条件,那么你可以假设你遇到了你提到的特殊情况。

如果我们知道一行应该有多少字段

或者,如果您知道每个阵列中的成员数量应始终相同(CSV的每一行上的字段),那么您的逻辑就会变得更简单。只需查找一个成员太多的数组。

举个例子,我们假设每个数组应该只有五个成员:

0:索引/ ID号

1:经络时间值

2:欧元货币金额

3:测试数据1

4:测试数据2

我们现在可以查找包含六个成员的数组并应用我们的业务逻辑:

String line = fileIn.ReadLine();
String[] pieces = line.Split(',');

if( pieces.Length == 6 ) 
{
    pieces[2] = String.Concat(pieces[2], pieces[3]);
    pieces[3] = pieces[4];
    pieces[4] = pieces[5];
}    

csvComplete cEve = new csvComplete (pieces[0], pieces[1], pieces[2], pieces[3], pieces[4]);// assign to class cEve
entries.Add(cEve);

答案 4 :(得分:0)

轻量级溶液

  

你有没有看到我在另一个角色的引号内转换逗号。适用于字符串中具有相同大小写的所有字段。您可以将此代码段放在可重用的方法中。

示例字符串: 40,3063,16,32,36,37,41,56,5,<强> “$ 30,600,000.00” 12 /二千零十七分之四

                string sRead = sr.ReadLine();
                char[] srcTemp = sRead.ToCharArray();
                for (int i = 0; i < srcTemp.Length - 1; i++)
                {
                    if ((int)srcTemp[i] == 34)
                    {
                        int yCharnichart = 0;
                        for (int c = i + 1; c < srcTemp.Length - 1; c++)
                        {
                            if ((int)srcTemp[c] == 34) break;
                            if ((int)srcTemp[c] == 44) srcTemp[c] = (char)182;
                            yCharnichart++;
                        }
                        i += yCharnichart + 1;
                    }
                }
                StringBuilder sb = new StringBuilder();
                sb.Append(srcTemp);
  

结果: 40,3063,16,32,36,37,41,56,5, “$30¶600¶000.00” 12 /二千〇一十七分之四

最后:只需再次为逗号替换您选择的角色

BOLSA = arRead[9].Replace((char)182, (char)44)