c#解析CSV到JSON错误格式

本文关键字:错误 格式 JSON 解析 CSV | 更新日期: 2023-09-27 18:04:37

看看,让我知道我在搞什么鬼;)

[HttpPost]
public ActionResult Upload(HttpPostedFileBase File)
{
    HttpPostedFileBase csvFile = Request.Files["adGroupCSV"];
    byte[] buffer = new byte[csvFile.ContentLength];
    csvFile.InputStream.Read(buffer, 0, csvFile.ContentLength);
    string csvString = System.Text.Encoding.UTF8.GetString(buffer);
    string[] lines = Regex.Split(csvString, "'r");
    List<string[]> csv = new List<string[]>();
    foreach (string line in lines)
    {
        csv.Add(line.Split(','));
    }
    string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(csv);
        ViewData["CSV"] = json;
        return View(ViewData);
}

给人的印象是:

json = "[['"Col1'",'"Col2'",'"Col3'",'"Col4'",'"Col5'",'"Col6'"],['"test'",'"test'",'"test'",'"test'",'"http://www.test.com/'",'"test/'"],['"test'",'"test'",'"test'",'"test'",'"http://www.test.com...

这就是我想要的:

{"Col1":"test","Col2":"test","Col3":"test","Col4":"test","Col5":"http://www.test.com/","Col6":"test/"}

下面是CSV

的示例
Col1,Col2,Col3,Col4,Col5,Col6
Test1,Test1,Test1,test1,test.test,test/
Test2,Test2,Test2,test2,test.test,test/
Test3,Test3,Test3,test3,test.test,test/
Test4,Test4,Test4,test4,test.test,test/

c#解析CSV到JSON错误格式

你需要一本字典。只是替换

List<string[]> csv = new List<string[]>();
foreach (string line in lines)
{
    csv.Add(line.Split(','));
}

var csv = lines.Select(l => l.Split(',')
                            .Select((s,i)=>new {s,i})
                            .ToDictionary(x=>"Col" + (x.i+1), x=>x.s));

It should work…

编辑

var lines = csvString.Split(new char[] { ''n', ''r' }, StringSplitOptions.RemoveEmptyEntries);
var cols = lines[0].Split(',');
var csv = lines.Skip(1)
               .Select(l => l.Split(',')
                             .Select((s, i) => new {s,i})
                             .ToDictionary(x=>cols[x.i],x=>x.s));
var json = new JavaScriptSerializer().Serialize(csv);

它看起来像你有一个字符串数组的数组,当你只想要一个对象与所有列作为属性在它。

而不是建立你的

List<string[]> csv = new List<string[]>();

你能从JSON中创建一个新对象吗?

public class UploadedFileObject
{
    public string Col1 { get; set; }
    public string Col2 { get; set; }
    public string Col3 { get; set; }
    public string Col4 { get; set; }
    public string Col5 { get; set; }
    public string Col6 { get; set; }
}


[HttpPost] public ActionResult Upload(HttpPostedFileBase File)
{
HttpPostedFileBase csvFile = Request.Files["adGroupCSV"];
byte[] buffer = new byte[csvFile.ContentLength];
csvFile.InputStream.Read(buffer, 0, csvFile.ContentLength);
string csvString = System.Text.Encoding.UTF8.GetString(buffer);
string[] lines = Regex.Split(csvString, "'r");
List<UploadedFileObject> returnObject = new List<UploadedFileObject>();
foreach (string line in lines)
{
    String[] lineParts = line.Split(',');
    UploadedFileObject lineObject = new UploadedFileObject();
    lineObject.Col1 = lineParts[0];
    lineObject.Col2 = lineParts[1];
    lineObject.Col3 = lineParts[2];
    lineObject.Col4 = lineParts[3];
    lineObject.Col5 = lineParts[4];
    lineObject.Col6 = lineParts[5];
    returnObject.add(lineObject);
}
string json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(returnObject);
    ViewData["CSV"] = json;
    return View(ViewData);
}

与前面的答案一致,也许您可以使用ServiceStack将CSV反序列化为对象数组,然后使用ServiceStack的JSON序列化器重新序列化它?

http://www.servicestack.net/docs/text-serializers/json-csv-jsv-serializers

您需要确保您正在使用JavaScriptSerializer期望您使用的格式。

因为你给它一个List<string[]>,它的格式为:

"[[list1Item1,list1Item2...],[list2Item1,list2Item2...]]"

这将在您的文件中关联为row1 -> list1等

然而,您想要的是第一个列表中的第一个项目,与第二个列表中的第一个项目对齐,以此类推。

我不知道JavaScriptSerializer的确切工作原理,但你可以尝试给它一个Dictionary而不是List<string[]>,假设你只有一行数据(共两行)。

这将涉及缓存前两行,并执行以下操作:
for (int i = 0; i < first.Length; i++)
{
    dict.Add(first[i],second[i]);
}