如何使用C#处理CSV文件中的换行符?

use*_*658 12 c# csv

我有一个Excel电子表格在C#中转换为CSV文件,但在处理换行符时遇到问题.例如:

"John","23","555-5555"

"Peter","24","555-5
555"

"Mary,"21","555-5555"
Run Code Online (Sandbox Code Playgroud)

当我读取CSV文件时,如果记录没有以双引号(")开头,那么错误就会出现换行符,我必须将其删除.我有一些来自互联网的CSV读取器类,但我担心它们在换行时会失败.

我该如何处理这些换行符?


非常感谢大家的帮助.

heres是我到目前为止所做的,我的记录有固定的格式,一切都从一开始

JTW;...;....;...;

JTW;...;...;....

JTW;....;...;..

..;...;... (wrong record, line brak inserted)

JTW;...;...
Run Code Online (Sandbox Code Playgroud)

所以我检查了;每一行的[3]位置.如果我写的是真的,如果假病附加在最后*删除换行符)

我现在遇到问题,因为我将文件保存为txt.

顺便说一句,我通过在excell中保存为csv将excell spreadshit转换为csv.但我不确定客户是否这样做.

所以作为TXT的文件是完美的.香港专业教育学院检查了记录和总数.但现在我必须将它转换回csv,我真的很想在程序中做到这一点.有人知道吗?

这是我的代码:

namespace EditorCSV
{
    class Program
    {
        static void Main(string[] args)
        {
            ReadFromFile("c:\\source.csv");
    }


        static void ReadFromFile(string filename)
        {
            StreamReader SR;
            StreamWriter SW;
            SW = File.CreateText("c:\\target.csv");
            string S;
            char C='a';
            int i=0;
            SR=File.OpenText(filename);
            S=SR.ReadLine();
            SW.Write(S);
            S = SR.ReadLine();
            while(S!=null)
            {
                try { C = S[3]; }
                catch (IndexOutOfRangeException exception){
                    bool t = false;
                    while (t == false)
                    {
                        t = true;
                        S = SR.ReadLine();
                        try { C = S[3]; }
                        catch (IndexOutOfRangeException ex) { S = SR.ReadLine(); t = false; }

                    }
                }
                if( C.Equals(';'))
                {
                    SW.Write("\r\n" + S);
                    i = i + 1;
                }
                else
                {
                    SW.Write(S);

                }
                S=SR.ReadLine();
            }
            SR.Close();
            SW.Close();
            Console.WriteLine("Records Processed: " + i.ToString() + " .");
            Console.WriteLine("File Created SucacessFully");
            Console.ReadKey();


        }




        }
    } 
Run Code Online (Sandbox Code Playgroud)

Mic*_*oie 15

CSV具有预定义的处理方式.该站点提供了一个易于阅读的解释,说明了处理CSV的所有警告的标准方法.

然而,没有理由不使用可靠的开源库来读取和写入CSV文件,以避免出现非标准错误. LINQtoCSV是我最喜欢的库.它以简洁的方式支持阅读和书写.

或者,CSV库上的这个SO问题将为您提供最受欢迎的选项列表.


Dou*_*oug 5

而不是检查当前行是否缺少(")作为第一个字符,而是检查最后一个字符是否为(").如果不是,您知道您有换行符,并且您可以阅读下一行并将它们合并在一起.

我假设您的示例数据是准确的 - 字段用引号括起来.如果引号可能没有分隔文本字段(或者在非文本数据中以某种方式找到新行),那么所有的赌注都会被取消!

  • 生成CSV文件时,某些CSV应用程序不会为每个字段包含引号,因此这可能是一个错误的解决方案. (2认同)
  • 当然,我假设他的示例数据是准确的 - 字段用引号括起来.如果引号可能没有分隔文本字段(或者在非文本数据中以某种方式找到新行),那么所有的赌注都会被取消! (2认同)

Fre*_*ddy 1

也许您可以在 ReadLine() 期间计算 (")。如果它们是奇数,则会引发标志。您可以忽略这些行,或者获取接下来的两行并消除合并行中第一个出现的 "\n" 。