簡體   English   中英

將CSV文件轉換為2D數組

[英]Converting a CSV File Into a 2D Array

如何將CSV文件中的數據轉換為二維數組?

array[row][column]

我已經有一個上傳腳本,可以顯示CSV文件中的所有數據。

我的代碼的小片段,這里是完整的代碼: http//jsfiddle.net/Meesz/wj6q7c30/

reader.onload = function (e) {
  var table = document.createElement("table");
  var rows = e.target.result.split("\n");
  for (var i = 0; i < rows.length; i++) {
    var row = table.insertRow(-1);
    var cells = rows[i].split(",");
    for (var j = 0; j < cells.length; j++) {
        var cell = row.insertCell(-1);
        cell.innerHTML = cells[j];
    }
  }
  var dvCSV = document.getElementById("dvCSV");
  dvCSV.innerHTML = "";
  dvCSV.appendChild(table);
}

真正的答案:使用Papa Parse 節省轉義/引用字段的麻煩,包含分隔符的字段,CSV格式的變體等等...

“自己動手”的方式: csvStr.split("\\n").map(function(row){return row.split(",");})

使用String.split()Array.map()

因為“ map()方法創建一個新數組,其結果是在此數組中的每個元素上調用一個提供的函數” (來源: MDN ,它是 非常適合 有點適合從已經通過split()方法轉換為數組的非常基本的 CSV字符串創建二維數組。

 function csvToArray (csv) { rows = csv.split("\\n"); return rows.map(function (row) { return row.split(","); }); }; // Hard-coded for brevity, but you can set this variable with FileReader var csv = "the,quick,brown,fox\\n" + "jumps,over,the,lazy,dog"; var array = csvToArray(csv); console.log(array); 
 Open your console. 

更新:

如果您的單元格包含引號,逗號或其他轉義字符,則此基本解決方案會崩潰。 要解決更復雜的CSV字符串,您必須實現RegEx解決方案(請參閱如何使用Javascript解析CSV字符串的已接受答案 ); 並且為了支持多種常見格式,你最好只使用一個庫。

邏輯類似於(但比簡單)你正在做的顯示結果:

var data = [];
var rows = e.target.result.split("\n");

for (var i = 0; i < rows.length; i++) {
  var cells = rows[i].split(",");
  data.push( cells );
}

 var data = []; var csv = "one,two,three\\n" + "four,five,six"; var rows = csv.split("\\n"); for (var i = 0; i < rows.length; i++) { var cells = rows[i].split(","); data.push( cells ); } console.dir(data); 

我今天需要這樣的東西,所以我找到了最初由Bennadel完成的片段,並將其清理了一下,並添加了邊緣情況。

/*
 *  shortened version of:
 *   http://www.bennadel.com/blog/1504-ask-ben-parsing-csv-strings-with-javascript-exec-regular-expression-command.htm
 *
 *  Supports columns that are quoted/non-quoted. Takes care of quoted columns that may also have \n's inside
 *  them instead of using a naive approach of split('\n')
 *
 *  @param csvString {string} CSV file of rows separated by new lines.  
 *  @param delimiter {string} delimiter used to split columns 
 *
 *  return {rows} Array of rows with columns containing parsed CSV data
 */

function CSVParse(csvString, delimiter = ",") {

  if (!csvString || !csvString.length)
    return [];

  const pattern = new RegExp(
   ( "(\\" + delimiter + "|\\r?\\n|\\r|^)" +
     "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
     "([^\"\\" + delimiter + "\\r\\n]*))"
   ), "gi"
  );

  let rows = [[]]; 
  let matches = false;

  while (matches = pattern.exec(csvString)) {

    const matched_delimiter = matches[1];
    const matched_cellQuote = matches[2];
    const matched_cellNoQuote = matches[3];

    /*
     * Edge case: Data that starts with a delimiter
     */
    if (matches.index == 0 && matched_delimiter)
      rows[rows.length - 1].push("");

    /*
     * Fix empty lines
     */
    if(!matches[2] && !matches[3])
      continue;

    if (matched_delimiter.length && matched_delimiter !== delimiter)
      rows.push([]);

    const matched_value = (matched_cellQuote)
      ? matched_cellQuote.replace(
          new RegExp("\"\"", "g"), "\""
        )
      : matched_cellNoQuote;

    rows[rows.length - 1].push(matched_value);

   }

   return rows;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM