others - 使用javascript,如何从 *.CSV文件读取数据?

我的csv数据如下所示:

heading1,heading2,heading3,heading4,heading5,value1_1,value2_1,value3_1,value4_1,value5_1,value1_2,value2_2,value3_2,value4_2,value5_2.

如何读取此数据并将数组转换为这样的数组:

[heading1 :value1_1,heading2 :value2_1,heading3 :value3_1,heading4 : value4_1,heading5 :value5_1 ],[heading1 :value1_2,heading2 :value2_2,heading3 : value3_2,heading4 :value4_2,heading5 :value5_2 ]。

使用JavaScript我已经尝试过此代码,但是不能工作!


<script type="text/javascript">
 var allText =[];
 var allTextLines = [];
 var Lines = [];

 var txtFile = new XMLHttpRequest();
 txtFile.open("GET","file://d:/data.txt", true);
 txtFile.onreadystatechange = function()
 {
 allText = txtFile.responseText;
 allTextLines = allText.split(/rn|n/);
 };

 document.write(allTextLines);<br>
 document.write(allText);<br>
 document.write(txtFile);<br>
</script>

时间:


data.txt文件是一个逗号分隔的字符串,并且没有换行符时,此代码将工作:

data.txt :


 heading1,heading2,heading3,heading4,heading5,value1_1,...,value5_2

javascript :


$(document).ready(function() {
 $.ajax({
 type:"GET",
 url:"data.txt",
 dataType:"text",
 success: function(data) {processData(data);}
 });
});

function processData(allText) {
 var record_num = 5; // or however many elements there are in each row
 var allTextLines = allText.split(/rn|n/);
 var entries = allTextLines[0].split(',');
 var lines = [];

 var headings = entries.splice(0,record_num);
 while (entries.length>0) {
 var tarr = [];
 for (var j=0; j<record_num; j++) {
 tarr.push(headings[j]+":"+entries.shift());
 }
 lines.push(tarr);
 }
 // alert(lines);
}

以下代码将在CSV文件上工作,每组记录之间都有换行符:

data.txt :


heading1,heading2,heading3,heading4,heading5
value1_1,value2_1,value3_1,value4_1,value5_1
value1_2,value2_2,value3_2,value4_2,value5_2

javascript :


$(document).ready(function() {
 $.ajax({
 type:"GET",
 url:"data.txt",
 dataType:"text",
 success: function(data) {processData(data);}
 });
});

function processData(allText) {
 var allTextLines = allText.split(/rn|n/);
 var headers = allTextLines[0].split(',');
 var lines = [];

 for (var i=1; i<allTextLines.length; i++) {
 var data = allTextLines[i].split(',');
 if (data.length == headers.length) {

 var tarr = [];
 for (var j=0; j<headers.length; j++) {
 tarr.push(headers[j]+":"+data[j]);
 }
 lines.push(tarr);
 }
 }
 // alert(lines);
}

http://jsfiddle.net/mblase75/dcqxr/

不需要写你自己的。

jQuery的CSV库有一个名为$.csv.toObjects(csv)的函数,它可以自动映射。

注意:这个库旨在处理符合RFC 4180标准的CSV数据,包括大多数'简单'解决方案,忽略恶心是边缘情况。

首先需要添加换行符以便让CSV数据有效。

使用以下数据集:


heading1,heading2,heading3,heading4,heading5
value1_1,value2_1,value3_1,value4_1,value5_1
value1_2,value2_2,value3_2,value4_2,value5_2

使用代码:


var data = $.csv.toObjects(csv):

保存在'数据'中的输出为:


[
 { heading1:"value1_1",heading2:"value2_1",heading3:"value3_1",heading4:"value4_1",heading5:"value5_1" } 
 { heading1:"value1_2",heading2:"value2_2",heading3:"value3_2",heading4:"value4_2",heading5:"value5_2" }
]

如果你想自己试试,我建议看一下基本用法演示 。

免责声明:我是jquery csv的原始作者。

这个问题很旧,但是现在有一个更好的解决方案, 可以使用Papa Parse,这是我写的一个库,它解析CSV文本,这是我知道的唯一支持gb大小的JS库,它还能优雅地处理格式错误的输入。

1分钟内解析出1GB文件: Parsed 1 GB file in 1 minute

Papa Parse 4 现在是浏览器中已知最快的CSV解析器 。)

解析文本非常简单:


var data = Papa.parse(csvString);

解析文件也很简单:


Papa.parse(file, {
 complete: function(results) {
 console.log(results);
 }
});

流文件类似于(下面是一个远程文件流的例子):


Papa.parse("http://example.com/bigfoo.csv", {
 download: true,
 step: function(row) {
 console.log("Row:", row.data);
 },
 complete: function() {
 console.log("All done!");
 }
});

我通过将1更改为0在这里工作:


for (var i=1; i<allTextLines.length; i++) {

更改为


for (var i=0; i<allTextLines.length; i++) {


// Parse a CSV row, accounting for commas inside quotes 
function parse(row){
 var insideQuote = false, 
 entries = [], 
 entry = [];
 row.split('').forEach(function (character) { 
 if(character === '"') {
 insideQuote = !insideQuote; 
 } else {
 if(character =="," && !insideQuote) { 
 entries.push(entry.join('')); 
 entry = []; 
 } else {
 entry.push(character); 
 } 
 } 
 });
 entries.push(entry.join('')); 
 return entries; 
}

例子使用函数解析类似于下面这样的CSV文件:


"foo, the column",bar
2,3
"4, the value",5

在数组中:


// csv could contain the content read from a csv file
var csv = '"foo, the column",barn2,3n"4, the value",5',

 // Split the input into lines
 lines = csv.split('n'),

 // Extract column names from the first line
 columnNamesLine = lines[0],
 columnNames = parse(columnNamesLine),

 // Extract data from subsequent lines
 dataLines = lines.slice(1),
 data = dataLines.map(parse);

// Prints ["foo, the column","bar"]
console.log(JSON.stringify(columnNames));

// Prints [["2","3"],["4, the value","5"]]
console.log(JSON.stringify(data));

以下是如何将数据转换为对象的方法,如d3的csv解析器 (这是一个第三方的解决方案):


var dataObjects = data.map(function (arr) {
 var dataObject = {};
 columnNames.forEach(function(columnName, i){
 dataObject[columnName] = arr[i];
 });
 return dataObject;
});

// Prints [{"foo":"2","bar":"3"},{"foo":"4","bar":"5"}]
console.log(JSON.stringify(dataObjects));

jsfiddle 。

...