3

我们与另一个依赖于来回传递 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在记录中间出现的换行符 ( ) 是记录终止符。

无论如何我可以预处理它以可靠地修复它吗?

请注意,我们对其他系统发出的内容的控制为零。

4

3 回答 3

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);
}

(为简单起见,我假设所有行都在开始时被读入;我假设您可以将其更改为足够轻松地懒惰地获取每一行。)

于 2012-11-15T22:16:25.737 回答
0

让我开始说您示例中的 CSV 文件无效。如果字符串中出现换行符,则应使用双引号字符将其包裹起来。

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

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

我不知道第二个假设是否成立,如果不成立,您可以增强逻辑,使其涵盖系统的业务规则。

祝你好运!

于 2012-11-15T22:21:15.883 回答
0

首先,我建议使用一个工具来管理读取和写入您的 csv 文件,我使用了很棒的FileHelpers 库

您基本上可以输入您的记录,它会为您完成所有验证等。值得努力。

对于您的问题,也许您可​​以对文件进行一些预处理并使用正则表达式将任何换行符替换为空格?

我做了类似的事情(不是文件而是)尝试

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

使用 FileHelpers,您可以编写一个自定义转换器来在处理期间执行此操作,或者挂钩到 BeforeRead 事件。

于 2012-11-15T22:26:26.173 回答