如何将CSV读入C#类

如何将CSV读入C#类,c#,csv,C#,Csv,我有以下课程 public class Department { public string id { get; set; } public string name { get; set; } } 我有一个csv文件,其中包含ID、名称的列表。我想读取ID,创建url和名称,并创建一个json主体来发布到url。我有以下代码,但我不知道如何将csv行拆分为id和名称 try { //

我有以下课程

    public class Department
    {
        public string id { get; set; }
        public string name { get; set; }
    }
我有一个csv文件,其中包含ID、名称的列表。我想读取ID,创建url和名称,并创建一个json主体来发布到url。我有以下代码,但我不知道如何将csv行拆分为id和名称

        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
                }
         }
试试看
{
//打开文件并读取
var csv=新列表();
var lines=System.IO.File.ReadAllLines(@“C:\File.csv”);
foreach(行中的字符串行)
//在这里添加代码
字符串url=”https://www.test.com/department/“+id;
尝试
{
HttpWebRequest请求=(HttpWebRequest)HttpWebRequest.Create(url);
添加(“授权”、“77ba42a2d0511e109068bcb9857d035da27a4eae”);
request.Method=“PUT”;
HttpWebResponse=(HttpWebResponse)request.GetResponse();
//为Json主体添加代码
}
}

我通常不建议使用解析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();
注意,我不确定这些是否是引号字符串,但如果是,您也可以修剪引号

Dislaimer,最好使用专用的CSV库:)为什么可以引用ISCSV字段并包含逗号和各种诡计


即使使用TextFieldParser,我也遇到了CSV解析问题。您的CSV可能没有嵌入的换行符,但是每当您在某些列中有任意文本的CSV时,您可以在行的中间有新的行。使用ReadAllLines永远不会正常工作

我没有导入一些相当大的库,而是编写了一个函数从CSV流中读取一行。它将每个单元格作为字符串读取,并去掉引号。这可能意味着您无法区分文件中的“2”和“2”,但通常情况下,这是不必要的。但是,它处理引号单元格中的逗号和换行符,这通常会使简单方法出错。它还处理引号内的引号,因此
所以她说“嗨!”
将被正确地解析为一个单元格,就像文本
所以她说“嗨!”

}

public void ReadCsvIntoListOfObjects{
变量状态=新列表();
var lines=File.ReadAllLines(“path.csv”).Skip(1);
foreach(行中的var行)
{
var值=行分割(“;”);
var st=新的CurrentAlertStatus();
var props=typeof(CurrentAlertStatus).GetProperties();
对于(int i=0;i

}

您应该使用合适的CSV解析器,如Microsoft.VisualBasic.FileIO.TextFieldParser
我为另一个答案编写的一个方法。。。我在var csv上面添加了字符串id=null。似乎身份证和姓名都没有填写。它正在读取文件,但id和名称为空。如果我不添加stringid=null,我会在字符串url行的id下得到一条曲线。以下是我的csv的外观。1,HR 2,IT@LauraBejjani更新了演示
    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...
    }
}
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);
        }