【问题标题】:C# Parse CSV to JSON Wrong FormatC# 将 CSV 解析为 JSON 格式错误
【发布时间】:2013-03-18 18:21:03
【问题描述】:

看看,让我知道我到底在说什么;)

[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/

【问题讨论】:

  • +1 表示“derping”。以前从没听说过那个。我喜欢那个!
  • 你能把输入文件的样本扔进去吗?
  • 那么,你明白了吗?仍有问题?

标签: c# json serialization csv


【解决方案1】:

你需要一本字典。直接替换

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));

它应该可以工作...

编辑

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);

【讨论】:

  • 如此接近,但我想使用 CSV 中提供的列名而不是 "Col" + (x.i+1)
  • 任何想法如何获得它? {{"total":2,"page":1,"records":2,"rows":[{"id":"1","cell":["test","test","test","test","test"]},{"id":"2","cell":["test","test","test","test","test"]}]}
  • 关于如何在此处获取它的任何想法。我更新了上面的代码。
【解决方案2】:

当您只想要一个对象并将所有列作为属性时,看起来您有一个字符串数组数组。

而不是建立你的

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 序列化程序重新序列化它? servicestack.net/docs/text-serializers/json-csv-jsv-serializers
  • 我先试试第一个答案,不想使用第三者。
  • 行 csv.add(line.split(','));不喜欢
【解决方案3】:

根据上一个答案,也许您可​​以使用 ServiceStack 将 CSV 反序列化为对象数组,然后使用 ServiceStack 的 JSON 序列化程序重新序列化它?

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

【讨论】:

    【解决方案4】:

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

    因为你给它一个List&lt;string[]&gt; 它正在格式化它:

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

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

    但是你想要的是第一个列表中的第一个项目,与第二个列表中的第一个项目对齐,依此类推。

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

    这将涉及缓存前两行并执行以下操作:

    for (int i = 0; i < first.Length; i++)
    {
        dict.Add(first[i],second[i]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 2016-05-30
      • 2014-09-09
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多