我正在try 用C#读取CSV文件.

我已经try 了File.ReadAllLines(path).Select(a => a.Split(';'))种方式,但问题是当一个单元格中有\n条多行时,它不起作用.

所以我在下面try 了一下

using LumenWorks.Framework.IO.Csv;

            var csvTable = new DataTable();
            using (TextReader fileReader = File.OpenText(path))
            using (var csvReader = new CsvReader(fileReader, false))
            {
                csvTable.Load(csvReader);
            }
            for (int i = 0; i < csvTable.Rows.Count; i++)
            {
               if (!(csvTable.Rows[i][0] is DBNull))
                {
                    var row1= csvTable.Rows[i][0];
                }
               if (!(csvTable.Rows[i][1] is DBNull))
                {
                    var row2= csvTable.Rows[i][1];
                }
            }

问题是上面的代码抛出的异常为 The CSV appears to be corrupt near record '0' field '5 at position '63'个 这是因为CSV的标题有两个双引号,如下所示

"Header1",""Header2""

有没有办法可以忽略双引号并处理CSV. update

我已经试了TextFieldParser次,如下所示

     public static void GetCSVData()
        {
            using (var parser = new TextFieldParser(path))
            {
                parser.HasFieldsEnclosedInQuotes = false;
                parser.Delimiters = new[] { "," };
                while (parser.PeekChars(1) != null)
                {
                    string[] fields = parser.ReadFields();
                    foreach (var field in fields)
                    {
                        Console.Write(field + " ");
                    }
                    Console.WriteLine(Environment.NewLine);
                }
            }
        }

The output: enter image description here

Sample CSV data I have used: enter image description here

如有任何帮助,我们不胜感激.

推荐答案

希望这能奏效!

请替换CSV中的两个双引号,如下所示:

using (FileStream fs = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
    StreamReader sr = new StreamReader(fs);
    string contents = sr.ReadToEnd();

    // replace "" with "
    contents = contents.Replace("\"\"", "\"");

    // go back to the beginning of the stream
    fs.Seek(0, SeekOrigin.Begin);

    // adjust the length to make sure all original
    // contents is overritten
    fs.SetLength(contents.Length);

    StreamWriter sw = new StreamWriter(fs);
    sw.Write(contents);
    sw.Close();
}

然后使用相同的CSV帮助器

using LumenWorks.Framework.IO.Csv;

var csvTable = new DataTable();
using (TextReader fileReader = File.OpenText(path))
using (var csvReader = new CsvReader(fileReader, false))
{
    csvTable.Load(csvReader);
}

谢谢.

Csharp相关问答推荐

MongoDB将JS查询转换为C#的问题

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

有没有办法把+02:00转换成TimeSpan?""

是否可以使用EF—Core进行临时部分更新?

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

自动映射程序在GroupBy之后使用项目

Mongo作为.NET中Testcontainers的副本集

UWP中的任务和界面

为什么EventInfo.EventHandlerType返回可为空的Type值?

如何在C#中使用Postman中的本地IP向本地主机上运行的本地API发出请求

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

尽管保证密钥不同,但已添加相同密钥的项(&Q;)

Docker Container中的HttpRequest后地址不可用

反序列化私有成员

如何在onNext之前等待订阅者完成?

VS 2022与VS 2019:如何/为什么创建额外的任务?

我找不到ASP.NET Web应用程序(.NET框架).已 Select .NET框架项目和项模板以及此组件(&Q;)

c#在后台实现类型化数组

Azure函数正在返回值列表,但该列表在Chrome中显示为空

MudBlazor MudTabs-->;选项卡内容高度