Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析CSV文件_C#_Csv - Fatal编程技术网

C# 解析CSV文件

C# 解析CSV文件,c#,csv,C#,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 amongs

我们与另一个系统进行了集成,该系统依赖于来回传递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>代码>),在记录中间,当记录终止符时发生。< /P> 我是否可以对其进行预处理以可靠地修复它


请注意,我们对其他系统的发射进行了零控制。

因此,您应该能够或多或少地执行以下操作:

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);
}
for(int i=0;i

(为了简单起见,我假设所有行都是在开始时读入的;我假设您可以将其更改为非常轻松地懒洋洋地获取每一行。)

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

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

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

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


祝你好运

首先,我建议您使用一个工具来管理csv文件的读写,我使用的是非常棒的

基本上,您可以键入记录,它将为您执行所有验证等操作。值得付出努力

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

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


使用FileHelpers,您可以编写自定义转换器在处理过程中执行此操作,或者挂接到BeforeRead事件。

有很多CSV阅读器。。我曾经成功地使用过这个。它真的很快。你可以设置规则并对其进行调整。找到编写代码生成无效格式的人并将其删除,然后让你的代码
抛出新的FormatException()。我不认为大多数格式化程序能够处理这个问题,因为字段周围没有引号;您需要自己滚动。我想您可以计算新行上未转义的
字符的数量,如果它为0,则它实际上不是新记录。将标准列表发送给他们,其中说明字段可以嵌入新行,但必须用引号括起来。我们可以挖掘一些可能已经处理这个问题的库,可能是我们已经在使用FileHelpers的库。但是,它会在不符合规范的行上爆炸,所以我们将其设置为忽略这些,然后继续。如果您有编写自定义转换器来处理它的详细信息,我会感兴趣的…您绝对正确地认为它是无效的。然而,生产这种垃圾的巨型公司已经承诺修复它3年了;所以我没有屏住呼吸。不幸的是,我们不能保证1和评论字段很可能以数字开头。我喜欢这个。我会试一试的。
line.Replace(Environment.NewLine, " ");