【问题标题】:CSV to JSON list of arraysCSV 到 JSON 的数组列表
【发布时间】:2021-07-19 05:29:33
【问题描述】:

我的 csv 是这样的,只有数字。没有标题。我必须确定 javascprit (node.js) 代码中每一列的名称。

1364.00,0.15,0.36,-0.13,-3.24,-0.42,-0.15,0.90,0.00,-0.01,0.02,0.26,0.01,-0.04
1374.00,0.30,0.76,-0.25,-3.25,-0.41,-0.13,0.91,0.00,-0.00,0.02,0.26,0.01,-0.04
1384.00,0.45,1.08,-0.35,-3.17,-0.41,-0.10,1.00,-0.00,-0.01,0.02,0.26,0.01,-0.07

节点js代码


    const csvFilePath = "test - Cópia.csv"
    
    const csvtojsonV2=require('csvtojson')
    csvtojsonV2({
        noheader:true,
        checkType:true,    
        headers:["Time","Yaw","Pitch","Roll","Heading","Ax", "Ay", "Az","Gx","Gy", "Gz", "Mx", "My", "Mz"],
        colParser:{        
            "column1": Int32Array,
            "column2":Int32Array,
            "column3":Int32Array,
            "column4":Int32Array,
            "column5":Int32Array,
            "column6":Int32Array,
            "column7":Int32Array,
            "column8":Int32Array,
            "column9":Int32Array,
            "column10":Int32Array,
            "column11":Int32Array,
            "column12":Int32Array,
            "column13":Int32Array,
            "column14":Int32Array},
            
        
    })
    .fromFile(csvFilePath)
    .then((json) => {
        console.log(json)  
    }) 

我用上面的代码得到的结果是这个json:

[
      {
        Time: 1364,
        Yaw: 0.15,
        Pitch: 0.36,
        Roll: -0.13,
        Heading: -3.24,
        Ax: -0.42,
        Ay: -0.15,
        Az: 0.9,
        Gx: 0,
        Gy: -0.01,
        Gz: 0.02,
        Mx: 0.26,
        My: 0.01,
        Mz: -0.04
      },
      {
        Time: 1374,
        Yaw: 0.3,
        Pitch: 0.76,
        Roll: -0.25,
        Heading: -3.25,
        Ax: -0.41,
        Ay: -0.13,
        Az: 0.91,
        Gx: 0,
        Gy: -0,
        Gz: 0.02,
        Mx: 0.26,
        My: 0.01,
        Mz: -0.04
      },
      {
        Time: 1384,
        Yaw: 0.45,
        Pitch: 1.08,
        Roll: -0.35,
        Heading: -3.17,
        Ax: -0.41,
        Ay: -0.1,
        Az: 1,
        Gx: -0,
        Gy: -0.01,
        Gz: 0.02,
        Mx: 0.26,
        My: 0.01,
        Mz: -0.07
      }
    ]

我想要一点不同,像这样(如下:每列都是一个数组字典。

{"Time": [1364.0, 1374.0, 1384.0], 
"Yaw": [0.15, 0.3, 0.45], 
"Pitch": [0.36, 0.76, 1.08], 
"Heading": [-0.13, -0.25, -0.35], 
"Roll": [-3.24, -3.25, -3.17], 
"Ax": [-0.42, -0.41, -0.41], 
"Ay": [-0.15, -0.13, -0.1], 
"Az": [0.9, 0.91, 1.0], 
"Gx": [0.0, 0.0, -0.0], 
"Gy": [-0.01, -0.0, -0.01], 
"Gz": [0.02, 0.02, 0.02], 
"Mx": [0.26, 0.26, 0.26], 
"My": [0.01, 0.01, 0.01], 
"Mz": [-0.04, -0.04, -0.07]} 

【问题讨论】:

  • 欢迎堆栈溢出!我鼓励您在how to ask 上阅读这篇文章,这是一个很好的问题。具体来说,问题询问如何在网站上将一种语言翻译成另一种语言are discouraged。您似乎对如何在 Javascript 中做某事有一个非常好的问题。请描述问题、您尝试过的(在 JavaScript 中)以及您希望看到的内容,然后删除 python 内容。
  • 感谢@MichaelDelgado。会这样做

标签: node.js json pandas csv csvtojson


【解决方案1】:

第一种方法

使用您的代码,它使用 csvtojson 库,您可以添加:

    const csvFilePath = "test - Cópia.csv"
    
    const csvtojsonV2=require('csvtojson')
    csvtojsonV2({
        noheader:true,
        checkType:true,    
        headers:["Time","Yaw","Pitch","Roll","Heading","Ax", "Ay", "Az","Gx","Gy", "Gz", "Mx", "My", "Mz"],
        colParser:{        
            "column1": Int32Array,
            "column2":Int32Array,
            "column3":Int32Array,
            "column4":Int32Array,
            "column5":Int32Array,
            "column6":Int32Array,
            "column7":Int32Array,
            "column8":Int32Array,
            "column9":Int32Array,
            "column10":Int32Array,
            "column11":Int32Array,
            "column12":Int32Array,
            "column13":Int32Array,
            "column14":Int32Array},
            
        
    })
    .fromFile(csvFilePath)
    .then((json) => {
       const RESULT = json.reduce((acc, v, i) => {
          for (const [key, value] of Object.entries(v)) {
            if (!acc[key]) acc[key] = [];
            acc[key].push(value);
          }
          return acc;
        }, {});
       console.log(RESULT)
    }) 

它的作用是在acc 变量中累积数据,使用每一行的键这些键作为标题,正如您在acc[key].push(value) 中看到的那样,if (!acc[key]) acc[key] = [] 是确保标题初始化为acc 变量(累加器)中的空数组;

第二种方法

这不使用任何库:

// Arbitrary data (from you example).
const DATA = `1364.00,0.15,0.36,-0.13,-3.24,-0.42,-0.15,0.90,0.00,-0.01,0.02,0.26,0.01,-0.04
1374.00,0.30,0.76,-0.25,-3.25,-0.41,-0.13,0.91,0.00,-0.00,0.02,0.26,0.01,-0.04
1384.00,0.45,1.08,-0.35,-3.17,-0.41,-0.10,1.00,-0.00,-0.01,0.02,0.26,0.01,-0.07
`.trim().split('\n').map(row => row.split(','));

const HEADERS = ["Time", "Yaw", "Pitch", "Roll", "Heading", "Ax", "Ay", "Az", "Gx", "Gy", "Gz", "Mx", "My", "Mz"];

const RESULT = {};

// Assign every heading to the result.
for (const HEADING of HEADERS) RESULT[HEADING] = [];

DATA.map(row =>
  // Each row → each column, number of columns === number of headers
  row.map((column, i) =>
    RESULT[HEADERS[i]]
    .push(Number(column))
  )
);

console.log(RESULT);

每一步的解释:

  1. 假设CSV的内容用“\n”分隔行,首选列分隔符是“,”,我设置了任意数据内容;
  2. 创建了常量HEADERS,标题必须与CSV的数据列长度相同;
  3. 创建了一个常量RESULT,这会将解析数据的结果存储到JSON。
  4. 我们用空数组定义的HEADERS初始化RESULT的键;
  5. 我们映射每个然后每个的数据,使用列的索引来引用我们HEADERS数组中的当前标题,因为列应等于HEADERS 常量的长度。

如果您必须保留数字的尾随零(例如:15.00),那么您可以在插入结果数组之前从 Number(column) 中的 Number(column) 中删除 .push() 方法。

【讨论】:

  • 在 NodeJS 中读取 CSV 文件:stackoverflow.com/questions/53031531/…
  • 非常感谢@rick stanley。我正在使用一个库,因为 csv 文件非常大。有 70000 行。我发现使用库可以更快地将 csv 解析和转换为 json
猜你喜欢
  • 1970-01-01
  • 2020-02-22
  • 2020-01-24
  • 2019-01-03
  • 1970-01-01
  • 2017-01-16
  • 2015-06-13
  • 2023-01-14
  • 1970-01-01
相关资源
最近更新 更多