我的应用程序数据通常是在excel中准备好的,然后我将其保存为CSV并在我的应用程序中读取。我目前正在使用this guide导入我的CSV文件并将其转换为对象数据。
出于某种原因,excel能够区分每个单元格中包含的逗号与分隔单元格的逗号,但是当我使用CSV阅读器(将其拆分为“,”)时,它无法区分这两者。
使用C#,我可以通过某种方式判断哪个是实际的逗号vs CSV文件中的新单元格?
以下是excel中的示例。它保存为“CSV逗号分隔”,在excel中打开没有问题,但将Column3分成“Some”和“thing”,认为它是2个单独的列。
答案 0 :(得分:1)
看看RFC 4180 https://tools.ietf.org/html/rfc4180这是相当常见的CSV文件的标准,生成的Excel文件将符合这一点(我听说有一个与标题丢失有关的例外,但是避风港& #39;遇到这个)。 注意:虽然Excel可以很好地与4180一起使用,但SSIS不会遵循它(虽然可以正常阅读),并且微软套件中还有其他例外。
如果Excel包含逗号,则Excel会在字段周围创建带引号(")的CSV记录,因此您的解析器需要将引号中的任何内容视为数据而不是字段分隔符。
您可以通过右键单击文件轻松查看在Excel中创建的CSV,然后选择编辑,应在记事本中打开。
样本记录(来自地址验证应用程序):
private ArrayList<Integer> getaardata()
{
ArrayList<Integer> arr = new ArrayList<>();
arr.clear();
for(int i=0;i<CallLogger.arrContactDetails.size()-1;i++)
{
for (int k = i+1; k < CallLogger.arrContactDetails.size(); k++)
{
String dateCurrnt = Util.convertStringToDate(
CallLogger.arrContactDetails.get(i).getDate());
String dateCurrntNew = Util.convertStringToDate(
CallLogger.arrContactDetails.get(k).getDate());
if(dateCurrnt.equalsIgnoreCase(dateCurrntNew)){
arr.add(Integer.parseInt(
CallLogger.arrContactDetails.get(i).getSmsCount()) +
Integer.parseInt(CallLogger.arrContactDetails.get(k).getSmsCount()));
}
else
{
arr.add(Integer.parseInt(
CallLogger.arrContactDetails.get(k).getSmsCount()));
}
}
}
Log.e("logtag", ""+arr.size());
return arr;
}
我不知道C#中的任何解析器,看起来几年前放弃并且有一个基于rfc4180的程序员构建(我没有代码)。
Apache有一个Java解析器,您可以从https://commons.apache.org/proper/commons-csv/download_csv.cgi下载源代码来查看。