我有以下课程
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
}
}
答案 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字段并包含逗号和各种恶作剧。
答案 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);
}
}