JavaScript数组到CSV

duf*_*uff 44 javascript csv arrays

我已经按照这篇文章如何将JavaScript数组信息导出到csv(在客户端)?获取嵌套的js数组写为csv文件.

该数组看起来像:

var test_array = [["name1", 2, 3], ["name2", 4, 5], ["name3", 6, 7], ["name4", 8, 9], ["name5", 10, 11]];
Run Code Online (Sandbox Code Playgroud)

链接中给出的代码很好地工作,除了在csv文件的第三行之后所有其余值都在同一行上,例如

name1,2,3
name2,4,5
name3,6,7
name4,8,9name5,10,11等

任何人都可以解释为什么会这样吗?使用Chrome或FF也是如此.

谢谢

编辑

jsfiddle http://jsfiddle.net/iaingallagher/dJKz6/

伊恩

Wal*_*oss 89

引用的答案是错误的.你必须改变

csvContent += index < infoArray.length ? dataString+ "\n" : dataString;
Run Code Online (Sandbox Code Playgroud)

csvContent += dataString + "\n";
Run Code Online (Sandbox Code Playgroud)

顺便说一下,引用的代码不是最理想的.你应该避免重复附加到字符串.您应该替换为数组,并在末尾执行array.join("\n").像这样:

var lineArray = [];
data.forEach(function (infoArray, index) {
    var line = infoArray.join(",");
    lineArray.push(index == 0 ? "data:text/csv;charset=utf-8," + line : line);
});
var csvContent = lineArray.join("\n");
Run Code Online (Sandbox Code Playgroud)

至于为什么引用的答案是错误的(有趣的是它已被接受!):,回调函数index的第二个参数forEach,是循环数组中的索引,将它与大小相比没有意义infoArray,是所述数组的项目(恰好也是一个数组).

  • 如果其中一个值中有'\n'或',',则会中断. (12认同)
  • 你确定字符串+ =不是最理想的吗?[本文](http://www.sitepoint.com/javascript-fast-string-concatenation/)似乎另有说法. (8认同)
  • fname怎么样?这些文件名为Download,而不是.csv文件 (5认同)
  • @WalterTross完美!谢谢!这完美无瑕!另外,我使用链接[1]下载内容.基本上使用`Blob`和`URL`.[1] http://stackoverflow.com/a/24922761/334872 (3认同)

Mir*_*ciu 15

一般形式是:

var ids = []; <= this is your array/collection
var csv = ids.join(",");
Run Code Online (Sandbox Code Playgroud)

对于你的情况,你将不得不适应一点

  • 这个答案假设要导出的数组中没有"特殊"字符(没有逗号,没有引号).如果有,这个答案将无效. (5认同)

Fra*_*jak 11

我创建了这个代码来创建一个漂亮,可读的csv文件:

var objectToCSVRow = function(dataObject) {
    var dataArray = new Array;
    for (var o in dataObject) {
        var innerValue = dataObject[o]===null?'':dataObject[o].toString();
        var result = innerValue.replace(/"/g, '""');
        result = '"' + result + '"';
        dataArray.push(result);
    }
    return dataArray.join(' ') + '\r\n';
}

var exportToCSV = function(arrayOfObjects) {

    if (!arrayOfObjects.length) {
        return;
    }

    var csvContent = "data:text/csv;charset=utf-8,";

    // headers
    csvContent += objectToCSVRow(Object.keys(arrayOfObjects[0]));

    arrayOfObjects.forEach(function(item){
        csvContent += objectToCSVRow(item);
    }); 

    var encodedUri = encodeURI(csvContent);
    var link = document.createElement("a");
    link.setAttribute("href", encodedUri);
    link.setAttribute("download", "customers.csv");
    document.body.appendChild(link); // Required for FF
    link.click();
    document.body.removeChild(link); 
}
Run Code Online (Sandbox Code Playgroud)

在您的情况下,由于您在数组中使用数组而不是数组中的对象,您将跳过标题部分,但您可以通过放置此列而不是该部分来自己添加列名:

// headers
csvContent += '"Column name 1" "Column name 2" "Column name 3"\n';
Run Code Online (Sandbox Code Playgroud)

秘诀是空格分隔csv文件中的列,我们将列值放在双引号中以允许空格,并转义值本身中的任何双引号.

另请注意,我将空值替换为空字符串,因为这符合我的需要,但您可以更改它并将其替换为您喜欢的任何内容.


Kon*_*tin 8

对于一个简单的csv,一个map()和一个join()就足够了:

var csv = test_array.map(function(d){
    return d.join();
}).join('\n');

/* Results in 
name1,2,3
name2,4,5
name3,6,7
name4,8,9
name5,10,11
Run Code Online (Sandbox Code Playgroud)

此方法还允许您在内部指定除逗号之外的列分隔符join.例如一个标签:d.join('\t')

另一方面,如果你想正确地做并将字符串括在引号中"",那么你可以使用一些JSON魔法:

var csv = test_array.map(function(d){
   return JSON.stringify(d);
})
.join('\n') 
.replace(/(^\[)|(\]$)/mg, ''); // remove opening [ and closing ] brackets from each line 

/* would produce
"name1",2,3
"name2",4,5
"name3",6,7
"name4",8,9
"name5",10,11
Run Code Online (Sandbox Code Playgroud)

如果你有像这样的对象数组:

var data = [
  {"title": "Book title 1", "author": "Name1 Surname1"},
  {"title": "Book title 2", "author": "Name2 Surname2"},
  {"title": "Book title 3", "author": "Name3 Surname3"},
  {"title": "Book title 4", "author": "Name4 Surname4"}
];

// use
var csv = data.map(function(d){
    return JSON.stringify(Object.values(d));
})
.join('\n') 
.replace(/(^\[)|(\]$)/mg, '');
Run Code Online (Sandbox Code Playgroud)


Zaz*_*Zaz 7

如果您的数据包含任何换行符或逗号,您需要先转义它们:

const escape = text =>
    text.replace(/\\/g, "\\\\")
        .replace(/\n/g, "\\n")
        .replace(/,/g, "\\,")

escaped_array = test_array.map(fields => fields.map(escape))
Run Code Online (Sandbox Code Playgroud)

然后简单地做:

csv = escaped_array.map(fields => fields.join(","))
                .join("\n")
Run Code Online (Sandbox Code Playgroud)

如果要使其可在浏览器中下载:

dl = "data:text/csv;charset=utf-8," + csv
window.open(encodeURI(dl))
Run Code Online (Sandbox Code Playgroud)


B.B*_*dan 5

以下代码是用 ES6 编写的,它可以在大多数浏览器中正常运行。

var test_array = [["name1", 2, 3], ["name2", 4, 5], ["name3", 6, 7], ["name4", 8, 9], ["name5", 10, 11]];

// Construct the comma seperated string
// If a column values contains a comma then surround the column value by double quotes
const csv = test_array.map(row => row.map(item => (typeof item === 'string' && item.indexOf(',') >= 0) ? `"${item}"`: String(item)).join(',')).join('\n');

// Format the CSV string
const data = encodeURI('data:text/csv;charset=utf-8,' + csv);

// Create a virtual Anchor tag
const link = document.createElement('a');
link.setAttribute('href', data);
link.setAttribute('download', 'export.csv');

// Append the Anchor tag in the actual web page or application
document.body.appendChild(link);

// Trigger the click event of the Anchor link
link.click();

// Remove the Anchor link form the web page or application
document.body.removeChild(link);
Run Code Online (Sandbox Code Playgroud)