以下内容从逗号分隔的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);
}
任何链接或建议都将不胜感激。
答案 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)