2015-01-21 137 views
1

从以逗号分隔的CSV文件读取以下内容。读取包含货币的逗号分隔的CSV

作为每行[3]中第三个字段的货币字段是问题。 我需要在逗号分割字段,但货币字段有时可能很大,也有它们。

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

csv总是在每行上有5个字段。

下例中的第一行工作,但第二行会导致问题。

3,09:29日下午,€20.00,测试,测试

1,02:55上午,€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); 

     } 

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

+0

如果字段引号分隔(' “ABC”, “d,E,F”,“GHI “')TextFieldParser和其他工具将处理它,但是'String.Split'不会。如果你让CSV考虑使用分号作为字段分隔符 – Plutonix 2015-01-21 00:15:59

+0

对不起,我无法控制csv,我在考虑按照第二个逗号忽略其余的行,直到我到达“某物”,但接下来的东西只能是一个逗号..我有点失落。 – Tom 2015-01-21 00:20:21

+0

您可以将其解析为最后两个字段,修剪掉前两个字段,并假定剩余文本是货币字段。 – gordy 2015-01-21 00:24:24

回答

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); 
    } 

} 

这应该占更大的货币(欧元万亿将有更多的逗号)。

希望这会有所帮助!

+0

非常好,谢谢 – Tom 2015-01-21 10:44:14

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

+0

我可以试试谢谢,但首先,我只是想知道textfieldparser将如何在货币领域的区别?我会阅读它,但似乎这个例子会有相同的结果? – Tom 2015-01-21 00:26:47

+0

在我的情况下,我的一个领域开始显示多个IP地址(逗号分隔),它用来显示电话号码。改变我的'String.Split()'处理csv的方式解决了这个问题。 – JRLambert 2015-01-21 00:30:36

+0

好的,谢谢,我会暂时尝试远离VB,谢谢你的帮助。 – Tom 2015-01-21 00:38:29

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); 

     } 
1

如果线的长度是动态

我的对这个问题的解决方案是在该阵列中的一个部件来实现,看起来为欧元符号“€”逻辑并基数“。”在随后的成员中。如果满足这个条件,那么你可以认为你遇到了你提到的特殊情况。

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

或者,如果你知道你应该始终有每个阵列中的相同数目的成员(字段的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); 
+0

谢谢我认为那样做我会再给它添加一些场景,它对于我需要感谢的磨坊来说是完美的..马克和其他人为你提供帮助 – Tom 2015-01-21 00:48:54

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)