2012-11-15 192 views
3

我们已经与另一个系统进行了整合,这个系统依赖于来回传递CSV文件(真的是老派)。解析CSV文件

的结构通常为:

ID, Name, PhoneNumber, comments, fathersname 
1, tom, 555-1234, just some random text, bill 
2, jill smith, 555-4234, other random text, richard 

每隔一段时间我们看到:

3, jacked up, 999-1231, here 
be dragons 
amongst us, ted 

主要问题我关心的是检测到线断路器(\n)中的过程中发生记录什么时候是记录终止者。

有无论如何我可以预处理这个可靠地解决它?

请注意,我们有零控制超过其他系统发出的。

+0

那里有很多CSV阅读器..我过去成功地使用了这个。它真的很快。 http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader 您可以设置规则并对其进行调整。 – 2012-11-15 22:06:09

+2

查找编写代码以生成无效格式并对其进行打击的人,然后让您的代码抛出新的FormatException();'。我不认为大多数格式化人员能够处理这个问题,没有引用这个领域的话;你需要推出自己的。 – Servy

+0

我想你可以指望nr。的未转义的'','换行符的字符,如果它是0而不是实际上是新的记录。 – Magnus

回答

1

所以,你应该能够做一些事情或多或少是这样的:

for (int i = 0; i < lines.Count; i++) 
{ 
    var fields = lines[i].Split(',').ToList(); 
    while (fields.Count < numFields)//here be dragons amonst us 
    { 
     i++;//include next line in this line 
     //check to make sure we haven't run out of lines. 

     //combine end of previous field with start of the next one, 
     //and add the line break back in. 
     var innerFields = lines[i].Split(','); 
     fields[fields.Count - 1] += "\n" + innerFields[0]; 

     fields.AddRange(innerFields.Skip(1)); 
    } 

    //we now know we have a "real" full line 
    processFields(fields); 
} 

(为简单起见,我假设所有线路都在开始读,我相信你可以改变它懒洋洋地获取每一行很容易。)

+0

我喜欢这个。会放弃它。 – NotMe

+0

完美工作。 – NotMe

0

让我开始说你的例子中的CSV文件是无效的。如果在一个字符串内发生换行符,它应该用双引号字符包装。

现在的答案 - 为了解析这个无效的CSV格式,你必须做几个假设。在这种情况下,我做了2个假设:1)ID列必须是数字2)注释字段不能包含数字。

基于这些假设,您可以检查换行符后面的第一个字符。如果它是数字,那么你会假设它有一个新的记录。如果不是,您应该将其视为注释字段的继续值。

我不知道第二个假设是否有效,如果没有,您可以增强逻辑,以便涵盖系统的业务规则。

祝你好运!

+0

你完全正确无效。然而,产生垃圾的大型巨型企业已经承诺将其修复3年,所以我不屏住呼吸。不幸的是,我们不能保证1,评论领域可能会以数字开头。 – NotMe

0

首先,我会推荐使用工具来管理读取和写入您的CSV文件,我使用FileHelpers library这是伟大的。

你基本上可以输入你的记录,它会为你做所有的验证。值得努力。

对于你的问题,也许你可以对文件做一些预处理,并使用Regex用空格替换任何换行符?

我做同样的事情(不是文件,而是)尝试

line.Replace(Environment.NewLine, " "); 

随着FileHelpers你可以写一个自定义转换器处理过程中要做到这一点,或挂接到BeforeRead事件。

+0

我们已经在使用FileHelpers。但是,它不符合规范的线条,所以我们设置它忽略这些规则并继续前进。如果你有编写一个自定义转换器来处理它的细节,我会感兴趣... – NotMe