我正在努力将CSV文件转换为JSON格式(用于图表控件)。
我需要的JSON数据格式如下:
var dataRetrievedfromCSV = [
{
"datalabel": "Humidity",
"time": "1:54",
"value": 78.4
},
{
"datalabel": "Temperature",
"time": "1:00",
"value": 9.2
},
{
"datalabel": "Temperature",
"time": "2:12",
"value": 16.4
},
{
"datalabel": "Humidity",
"time": "2:30",
"value": 78.2
}
];
CSV的格式是,时间在最左边的列,而标题信息(标签)在最上面的一行。(截图如下)
我在解析CSV时遇到了麻烦,在这种情况下,头部随时间而变化,同时包含所有值。
以下是我的当前代码:
public ActionResult GraphResults(string filePathT, int testNumber)
{
string filePath = filePathT;
DataTable dt = new DataTable();
TextReader reader = new StreamReader(filePath);
List<object> graphItems = new List<object>();
using (TextFieldParser parser = new TextFieldParser(filePath))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
bool firstRow = true;
while (!parser.EndOfData)
{
string[] currentRow = parser.ReadFields();
if (firstRow) //check for header row
{
foreach (string fields in currentRow)
{
dt.Columns.Add(fields, typeof(string));
}
continue;
}
//Create new data rows under header
DataRow dr = dt.NewRow();
dt.Rows.Add(dr);
for (int c = 0; c < currentRow.Count(); c++)
{
dr[c] = currentRow[c];
}
}
}
//once we have the datatable, attempt to organize for CSV?
foreach(DataRow row in dt.Rows)
{
foreach(DataColumn col in dt.Columns)
{
graphItems.Add(new
{
VALS = new
{
datalabel = ?,
time = ?,
value = ?
}
};
})
}
}
我成功地将CSV转换成了C#中的数据表,但我仍然(在代码的第二部分)在创建正确格式的JSON对象时遇到了麻烦。
graphItems是一个List,但我对任何组织/创建JSON格式的方法都持开放态度。
我试过简单地将整个数据表序列化为JSON,但这失败了,因为返回的格式不包括标签,或每个数据点的时间。
1条答案
按热度按时间hsgswve41#
您可能应该将数据转换为对象而不是数据网格。这有助于确保数据的有效性:
为了解析csv文件,你可能应该使用一个库,比如CsvHelper:
您可能需要配置读取器,以便使用索引或列标题名称将列Map到属性。看起来还有两行标题,因此可能需要读取第一行来忽略它。阅读文档了解详细信息。
然后,您可以为要导出的值创建类:
并Map所有对象:
最后使用一些库(如system.text.json)序列化对象列表