我一直在努力理解XML和CSV解析的工作方式,而不是实际编写任何代码。我可能要在正在进行的项目中解析.csv文件,我想做好准备。 (我必须将它们转换为.ofx文件)
我也知道那里可能有一千个XLM和csv解析器,所以我比我担心的更好奇。我打算使用我相信微软提供的XMLReader
。
假设我有以下.csv文件
02/02/2016; myfirstname;我的姓 ;某个地方; 321654;评论;布拉布拉
有时会丢失一个字段。这意味着,为了这个例子,姓氏不是强制性的,某些字段可能就在第一个名字后面。
我的问题是:
我可以计算字段的总数,但在我的情况下,两个是可选的,如果只有一个丢失,我不能确定它是哪一个。
;
,我如何确定它是评论的一部分,而不是以下标记的开头?同样,我可以计算其余字段并找出我的位置,但这排除了可选字段问题。
我的问题也适用于XML,如果用户开始在表单中编写XML,我该怎么办?我决定将表格导出为.csv或.xml,可能会有麻烦。
现在我假设c#Xml读取器/解析器非常棒,可以处理它;如果是的话,我真的很好奇。
答案 0 :(得分:1)
假设已正确导出CSV / XML数据,这些都不会成为问题。丢失的字段将由重复的分隔符处理:
2016年2月2日; myfirstname ;; somefield
字段中的分号通常通过引用来处理:
2016年2月2日; “myfirst;名称”;
报价在字符串中转义:
2016年2月2日; “我”, “第一”, “名称”;
使用XML它甚至不是问题,因为标签或属性都有名称。
如果你的CSV数据格式不正确,那么你就会遇到更大的问题,因为可能无法区分缺失的字段和非引用的分隔符。
答案 1 :(得分:0)
Fisrt
如何避免somefield和lastname之间的混淆?
如果不改变文件的逻辑,就没有办法做到这一点。例如:当" mylastname"是空的你可能有一个""值,空字符串或类似的;;
如何避免错误"标记"?我的意思是,如果用户的第一条评论包含一个;,我如何确定它是评论的一部分,而不是以下标记的开头?
很简单,你必须这样提交:
- 列的分离
"" - 列的delimetr
值;值;"值;;;;值&#34 ;;值
仅为separtor分割;没有分隔符""这段代码是经过测试和编译的
public static string[] SplitWithDelimeter(this string line, char separator, char checkSeparator, bool eraseCheckSeparator)
{
var separatorsIndexes = new List<int>();
var open = false;
for (var i = 0; i < line.Length; i++)
{
if (line[i] == checkSeparator)
{
open = !open;
}
if (!open && line[i] == separator )
{
separatorsIndexes.Add(i);
}
}
separatorsIndexes.Add(line.Length);
var result = new string[separatorsIndexes.Count];
var first = 0;
for (var j = 0; j < separatorsIndexes.Count; j++)
{
var tempLine = line.Substring(first, separatorsIndexes[j] - first);
result[j] = eraseCheckSeparator ? tempLine.Replace(checkSeparator, ' ').Trim() : tempLine;
first = separatorsIndexes[j] + 1;
}
return result;
}
返回将是:
值
值
&#34;值;;;;值&#34;
值
答案 2 :(得分:0)
使用XML,您的所有问题都将得到解决。