首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#读取CSV文件|具有标题行和逗号分隔值

C#读取CSV文件|具有标题行和逗号分隔值
EN

Stack Overflow用户
提问于 2018-08-26 15:48:26
回答 1查看 4.7K关注 0票数 1

下面是我的CSV结构(刚刚取了标题行和第一个数据行。

代码语言:javascript
复制
Header 1,Header 2,Header 3,Header 4,Header5
Value 1,"Value2 a,Value 2b","Value3 a,Value 3b",Value 4,Value5

假设CSV具有逗号分隔分隔符,我可以读取CSV、读取标题行和数据行。

几个代码片段-

代码语言:javascript
复制
var fileContent = File.ReadAllLines(csvFile.FullName);
List<string> headerValues = null;
List<string> contentAllRows= null;
if (fileContent !=null && fileContent.Any())
{
    headerValues = fileContent.First().Split(separators).ToList();
    headerValues.ForEach(h => h = h.Trim());
    contentAllRows = fileContent.Skip(1).ToList();
}
for (int row = 0; row <= contentAllRows.Count - 1; row++)
{
    var column = contentAllRows[row].Split(separators).ToList();
}

上述代码片段的输出

代码语言:javascript
复制
headerValues[0] = "Header 1"
headerValues[1] = "Header 2"
headerValues[2] = "Header 3"
headerValues[3] = "Header 4"
headerValues[4] = "Header5"

contentAllRows ="Value 1,\"Value2 a,Value 2b\",\"Value3 a,Value 3b\",Value 4,Value5"

columns[0] = "Value 1"
columns[1] = "\"Value2 a"
columns[2] = "Value 2b\""
columns[3] = "\"Value3 a"
columns[4] = "Value 3b\""
columns[5] = "Value 4"
columns[6] = "Value5"

我的预期输出(相对于上面的每个标头值)-

代码语言:javascript
复制
columns[0]="Value 1"
columns[1]="Value2 a,Value 2b"
columns[2]="Value3 a,Value 3b"
columns[3]=""
columns[4]="Value5"

在我看来,在上述情况下,Split()就是问题所在。对于上面的场景,我们有一个简单的解决方案吗?我正在考虑在读取CSV的同时拥有强类型的对象。上面的场景适合CSV helper模块@ https://joshclose.github.io/CsvHelper/2.x/吗?有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-28 06:59:58

既然你提到了使用CsvHelper的选项,那么使用它直接映射到你的POCO应该是相当简单的。假设有一个简单的对象:

代码语言:javascript
复制
public class Foo 
{
    public string Bar1 {get;set;}
    public string Bar2 {get;set;}
    public string Bar3 {get;set;}
    public string Bar4 {get;set;}
    public string Bar5 {get;set;}
}

定义类映射

代码语言:javascript
复制
internal sealed class MyCsvMap : ClassMap<Foo>
{
    public MyCsvMap()
    {
        Map(x => x.Bar1).Name("Header 1");
        Map(x => x.Bar2).Name("Header 2");
        Map(x => x.Bar3).Name("Header 3");
        Map(x => x.Bar4).Name("Header 4");
        Map(x => x.Bar5).Name("Header5");
    }
}

然后简单地

代码语言:javascript
复制
using (var sr = new StreamReader(csvFile.FullName))
{
    using (var csvReader = new CsvReader(sr))
    {
        csvReader.Configuration.RegisterClassMap<MyCsvMap>();
        return csvReader.GetRecords<Foo>().ToList();
    }
}

default setting of Configuration.Quote会忽略双引号内的分隔符,CsvHelper会自动处理带引号的字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52024242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档