簡體   English   中英

C# 讀取 CSV 文件 | 帶有標題行和逗號分隔值

[英]C# Reading CSV File | with header Row and Comma Separated Values

下面是我的 CSV 結構(剛剛取了標題行和第一個數據行。

Header 1,Header 2,Header 3,Header 4,Header5
Value 1,"Value2 a,Value 2b","Value3 a,Value 3b",Value 4,Value5

假設 CSV 具有逗號分隔的分隔符,我能夠讀取 CSV、讀取標題行和數據行。

很少的代碼片段 -

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

以上代碼片段的輸出

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"

我的預期輸出(針對上述每個標題值)-

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

在上述情況下, Split()對我來說似乎是問題。 對於上述情況,我們是否有一個簡單的解決方案,我正在考慮在讀取 CSV 時使用強類型對象。 上述場景是否適合 CSV 助手模塊 @ https://joshclose.github.io/CsvHelper/2.x/任何建議表示贊賞。

由於您提到了使用CsvHelper的選項 - 您使用它直接映射到您的 POCO 應該相當簡單。 假設一個簡單的對象:

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

定義類映射

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

然后簡單地

using (var sr = new StreamReader(csvFile.FullName))
{
    using (var csvReader = new CsvReader(sr))
    {
        csvReader.Configuration.RegisterClassMap<MyCsvMap>();
        return csvReader.GetRecords<Foo>().ToList();
    }
}

CsvHelper 應該自動處理您引用的字段 - Configuration.Quote默認設置會忽略雙引號內的分隔符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM