Pri*_*hee 11 c# csv json csvhelper
我在我的asp.net web API项目中使用JSON/CSV文件,并尝试使用CSVHelper和ServiceStack.Text库,但无法使其工作.
包含数组的JSON文件是动态的,可能包含任意数量的字段
我使用streamreader读取文件,然后需要将其转换为CSV文件,以便最终用户下载.
示例文件文本
[{"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"},
{"COLUMN1":"a","COLUMN2":"b","COLUMN3":"c","COLUMN4":"d","COLUMN5":"e"}]
Run Code Online (Sandbox Code Playgroud)
JSON到CSV
public static string jsonStringToCSV(string content)
{
var jsonContent = (JArray)JsonConvert.DeserializeObject(content);
var csv = ServiceStack.Text.CsvSerializer.SerializeToCsv(jsonContent);
return csv;
}
Run Code Online (Sandbox Code Playgroud)
这不会导致我的CSV数据
然后一些文件是带有逗号或制表符的分隔符类型,我想利用CSVHelper将CSV字符串动态转换为IEnumerable
public static IEnumerable StringToList(string data, string delimiter, bool HasHeader)
{
using (var csv = new CsvReader(new StringReader(data)))
{
csv.Configuration.SkipEmptyRecords = true;
csv.Configuration.HasHeaderRecord = HasHeader;
csv.Configuration.Delimiter = delimiter;
var records = csv.GetRecords();
return records;
}
}
Run Code Online (Sandbox Code Playgroud)
Pri*_*hee 35
我能够通过DeserializeObject将其解析为使用Json.net的数据表,所以想要发布我自己的答案但不会将其标记为已接受,如果有人有更好的方法来做到这一点.
将JSON字符串转换为DataTable
public static DataTable jsonStringToTable(string jsonContent)
{
DataTable dt = JsonConvert.DeserializeObject<DataTable>(jsonContent);
return dt;
}
Run Code Online (Sandbox Code Playgroud)
制作CSV字符串
public static string jsonToCSV(string jsonContent, string delimiter)
{
StringWriter csvString = new StringWriter();
using (var csv = new CsvWriter(csvString))
{
csv.Configuration.SkipEmptyRecords = true;
csv.Configuration.WillThrowOnMissingField = false;
csv.Configuration.Delimiter = delimiter;
using (var dt = jsonStringToTable(jsonContent))
{
foreach (DataColumn column in dt.Columns)
{
csv.WriteField(column.ColumnName);
}
csv.NextRecord();
foreach (DataRow row in dt.Rows)
{
for (var i = 0; i < dt.Columns.Count; i++)
{
csv.WriteField(row[i]);
}
csv.NextRecord();
}
}
}
return csvString.ToString();
}
Run Code Online (Sandbox Code Playgroud)
Web API中的最终用法
string csv = jsonToCSV(content, ",");
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new StringContent(csv);
result.Content.Headers.ContentType = new MediaTypeHeaderValue("text/csv");
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "export.csv" };
return result;
Run Code Online (Sandbox Code Playgroud)
Raj*_*ajN 16
我不知道为你的问题报告解决方案是否为时已晚.如果您想要探索开源库来完成这项工作,以下是其中之一
Cinchoo ETL使用几行代码轻松地将JSON转换为csv
using (var r = new ChoJSONReader("sample.json"))
{
using (var w = new ChoCSVWriter("sample.csv").WithFirstLineHeader())
{
w.Write(r);
}
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息/来源,请访问https://github.com/Cinchoo/ChoETL
Nuget套餐:
.NET Framework:
Install-Package ChoETL.JSON
Run Code Online (Sandbox Code Playgroud)
.NET核心:
Install-Package ChoETL.JSON.NETStandard
Run Code Online (Sandbox Code Playgroud)
完全披露:我是这个图书馆的作者.
最近遇到了同样的问题,我相信使用System.Dynamic.ExpandoObject和CsvHelper有一个更优雅的解决方案。它的代码更少,希望性能与 DataTable 相似或更好。
public static string JsonToCsv(string jsonContent, string delimiter)
{
var expandos = JsonConvert.DeserializeObject<ExpandoObject[]>(jsonContent);
using (var writer = new StringWriter())
{
using (var csv = new CsvWriter(writer))
{
csv.Configuration.Delimiter = delimiter;
csv.WriteRecords(expandos as IEnumerable<dynamic>);
}
return writer.ToString();
}
}
Run Code Online (Sandbox Code Playgroud)