如何避免在csv / XML中使用错误的分隔符



我一直在试图理解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数据格式不正确,那么您将面临更大的问题,因为可能无法区分缺少的字段和非引号分隔符。

  1. 如何避免虚假的"标签"?如果 (can) 包含分隔符,则应将字符串值引号括起来。如果创建 CSV 文件,请对所有字符串值进行引号和取消引号。
  2. 如何避免某个字段和姓氏之间的混淆?对此没有通用的解决方案,所有情况都必须一一处理。通用算法可以决定缺少名字或姓氏吗?不。如果您知道哪些字段可以省略,则可以编写"智能"处理。

使用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;
        }

返回将是:

价值

价值

"值;;;;值"

价值

最新更新