如何将CSV读入C#Class

时间:2018-05-13 02:35:59

标签: c# csv

我有以下课程

    public class Department
    {
        public string id { get; set; }
        public string name { get; set; }
    }

我有一个包含id,名称列表的csv文件。我想读取id并创建一个url和名称并创建一个json主体以发布到url。我有以下代码,但我不确定如何将csv行拆分为id和name。

        try
        {
            //Open File and Read
            var csv = new List<Department>();
            var lines = System.IO.File.ReadAllLines(@"C:\file.csv");
            foreach (string line in lines)
                // Add Code Here
                string url = "https://www.test.com/department/" + id;
                try
                {
                    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                    request.Headers.Add("Authorization", "77ba42a2d0511e109068bcb9857d035da27a4eae");
                    request.Method = "PUT";
                    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                    // Add Code for Json Body
                }
         }

3 个答案:

答案 0 :(得分:1)

我通常不建议使用string.Split解析csv。

但是,如果这是一个足够简单的csv文件,你可以这样做。

var lines = File.ReadAllLines(@"C:\file.csv");

var csv = lines.Select(x =>{
                              var parts = x.Split(',');
                              return new Department()
                                       {
                                          id = parts[0].Trim(),
                                          name = parts[1].Trim(),
                                       };
                           }).ToList();

注意,我不确定这些是否是引号字符串,但如果是,你也可以修改引号

免责声明,最好使用专用的CSV库:)之所以可以引用csv字段并包含逗号和各种恶作剧。

Full Demo Here

答案 1 :(得分:0)

我遇到了CSV解析问题,即使使用TextFieldParser也是如此。您的CSV可能没有嵌入换行符,但只要您在某些列中包含任意文本的CSV,就可以在一行中间添加新行。使用ReadAllLines永远不会正常工作。

我没有导入一些相当大的库,而是编写了一个从CSV流中读取一行的函数。这将每个单元格作为字符串读取,并删除引号。这可能意味着你无法告诉&#34; 2&#34;从文件中的2开始,但通常没有必要。但是,它处理引用单元格中的逗号和换行符,这通常会搞砸简单的方法。它还处理引号内的引号,因此"So she said, ""Hi!"""将作为文本So she said, "Hi!"

正确解析为一个单元格
    private static String[] ReadCSVRow( TextReader csv )
    {
        int ch;
        Boolean bInQuote = false;
        StringBuilder builder = new StringBuilder(128);
        List<String> columns = new List<String>();

        while ((ch = csv.Read()) != -1)
        {
            if (builder.Length == 0 && !bInQuote)
            {
                if (ch == '\"')
                    bInQuote = true;
                else if (ch == ',')
                {
                    // add an empty string
                    columns.Add("");
                }
                else if (ch == '\n')
                {
                    // return current columns
                    columns.Add("");
                    return columns.ToArray();
                }
                else if (ch != '\r')
                {
                    // start a new column
                    builder.Append((char)ch);
                }
            }
            else if (bInQuote)
            {
                // we have started our column with a quote
                if (ch == '\"')
                {
                    // peek to see if this is double.
                    int next = csv.Peek();
                    if (next == '\"')
                    {
                        // read it.
                        csv.Read();
                        // add it
                        builder.Append('\"');
                    }
                    else 
                    {
                        // no longer in quotes. next SHOULD be a comma or end of file.
                        bInQuote = false;
                    }
                }
                else
                {
                    builder.Append((char)ch);
                }
            }
            else
            {
                if (ch == ',')
                {
                    // add our column and go to next
                    columns.Add(builder.ToString());
                    builder.Clear();
                }
                else if (ch == '\n')
                {
                    // add column and return.
                    columns.Add(builder.ToString());
                    builder.Clear();
                    return columns.ToArray();
                }
                else if (ch != '\r')   // skip line feeds if not in quotes.
                {
                    builder.Append((char)ch);
                }
            }
        }

        //
        // we hit end of file without a new line. If we have data, return it, otherwise null.
        if (builder.Length > 0)
            columns.Add(builder.ToString());
        if (columns.Count == 0)
            return null;

        return columns.ToArray();
    }

现在,要使用它,你可以这样做:

using( TextReader reader = new StreamReader("C:\\file.csv")) {
    String[] row;
    while( (row = ReadCSVRow(reader)) != null ) {
         ...
         // first column in row[0], 2nd in row[1], etc...
    }
}

答案 2 :(得分:-1)

public class CurrentAlertStatus
{
    public string message_type { get; set; }
    public string seconds { get; set; }
    public string deviceid { get; set; }
    public string vin { get; set; }
    public string esn { get; set; }
    public string iccid { get; set; }

}

.....

public void ReadCsvIntoListOfObjects{
        var statuses = new List<CurrentAlertStatus>();
        var lines = File.ReadAllLines("path.csv").Skip(1);

        foreach (var line in lines)
        {
            var values = line.Split(";");
            var st = new CurrentAlertStatus();
            var props = typeof(CurrentAlertStatus).GetProperties();

            for (int i = 0; i < values.Length-1; i++)
            {
                props[i].SetValue(st, values[i]);
            }
            statuses.Add(st);
        }

}