如何避免在csv / XML中使用错误的分隔符
本文关键字:错误 分隔符 XML 何避免 csv | 更新日期: 2023-09-27 18:32:11
我一直在试图理解XML和CSV解析的工作原理,但还没有真正编写任何代码。我可能不得不在正在进行的项目中解析一个.csv文件,我想做好准备。(我必须将它们转换为 .ofx 文件)
我也知道那里可能有一千个 XLM 和 csv 解析器,所以我好奇多于担心。我打算使用我相信微软提供的XMLReader
。
假设我有以下.csv文件
02/02/2016 ; 我的名字 ; 我的姓氏 ; 某字段 ; 321654 ; 评论 ; blabla
有时会缺少一个字段。这意味着,为了示例,姓氏不是强制性的,并且某些字段可能紧跟在名字之后。
我的问题是:
- 如何避免某个字段和姓氏之间的混淆?
我可以计算字段总数,但在我的情况下,两个是可选的,如果只缺少一个,我无法确定它是哪一个。
- 如何避免虚假的"标签"?我的意思是,如果用户的第一条评论包含
;
,我如何确定这是他评论的一部分,而不是以下标签的开头?
同样,我可以计算剩余字段并找出我在哪里,但这不包括可选字段问题。
我的问题也适用于XML,如果用户开始以他的形式编写XML,我该怎么办?如果我决定将表单导出为.csv或.xml,可能会有麻烦。
现在我假设c#XML阅读器/解析器足够好来处理它;如果是的话,我真的很好奇如何。
假设CSV/XML数据已正确导出,这些都不是问题。 缺少的字段将由重复的分隔符处理:
02/02/2016;我的名字;;某田
字段中的分号通常通过引用来处理:
2016/02/02;"我的头号;名字";
引号在字符串中转义:
2016/02/02;"我的"第一个"名字";
对于XML,这甚至不是一个问题,因为标签或属性都有名称。
如果您的CSV数据格式不正确,那么您将面临更大的问题,因为可能无法区分缺少的字段和非引号分隔符。
- 如何避免虚假的"标签"?如果 (can) 包含分隔符,则应将字符串值引号括起来。如果创建 CSV 文件,请对所有字符串值进行引号和取消引号。
- 如何避免某个字段和姓氏之间的混淆?对此没有通用的解决方案,所有情况都必须一一处理。通用算法可以决定缺少名字或姓氏吗?不。如果您知道哪些字段可以省略,则可以编写"智能"处理。
使用XML,您的所有问题都将得到解决。
第一
如何避免某个字段和姓氏之间的混淆?
如果不更改文件的逻辑,就无法执行此操作。例如:当"mylastname"为空时,您可能有一个"值,空字符串或类似这样;;
如何避免虚假的"标签"?我的意思是,如果用户的第一条评论包含 ;,我如何确定它是他评论的一部分,而不是以下标签的开头?
您必须像这样提交文件很简单:
; - 列的分隔符
" - 列的分隔
值;值;"价值;;;;值";值
要只对 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;
}
返回将是:
价值
价值
"值;;;;值"
价值