如何避免csv / XML

时间:2016-01-28 08:50:42

标签: c# xml parsing csv

我一直在努力理解XML和CSV解析的工作方式,而不是实际编写任何代码。我可能要在正在进行的项目中解析.csv文件,我想做好准备。 (我必须将它们转换为.ofx文件)

我也知道那里可能有一千个XLM和csv解析器,所以我比我担心的更好奇。我打算使用我相信微软提供的XMLReader

假设我有以下.csv文件

  

02/02/2016; myfirstname;我的姓 ;某个地方; 321654;评论;布拉布拉

有时会丢失一个字段。这意味着,为了这个例子,姓氏不是强制性的,某些字段可能就在第一个名字后面。

我的问题是:

  • 如何避免somefield和lastname之间的混淆?

我可以计算字段的总数,但在我的情况下,两个是可选的,如果只有一个丢失,我不能确定它是哪一个。

  • 如何避免错误的“标签”?我的意思是,如果用户的第一条评论包含;,我如何确定它是评论的一部分,而不是以下标记的开头?

同样,我可以计算其余字段并找出我的位置,但这排除了可选字段问题。

我的问题也适用于XML,如果用户开始在表单中编写XML,我该怎么办?我决定将表格导出为.csv或.xml,可能会有麻烦。

现在我假设c#Xml读取器/解析器非常棒,可以处理它;如果是的话,我真的很好奇。

3 个答案:

答案 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)

  1. 如何避免错误的“标签”?如果(can)包含分隔符,则应引用字符串值。如果您创建CSV文件,请引用并取消引用所有字符串值。
  2. 如何避免somefield和lastname之间的混淆?对此没有一般解决方案,所有案例都必须逐一处理。一般算法可以决定是否缺少名字或姓氏?没有。 如果您知道可以省略哪些字段,则可以编写“智能”处理。
  3. 使用XML,您的所有问题都将得到解决。