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

如何使用javascript从*.CSV文件读取数据?,javascript,jquery,Javascript,Jquery,我的csv数据如下所示: 标题1,标题2,标题3,标题4,标题5,值1_1,值2_1,值3_1,值4_1,值5_1,值1_2,值2_2,值3_2,值4_2,值5_2 如何读取这些数据并使用Javascript将其转换为这样的数组 [标题1:value1\u 1,标题2:value2\u 1,标题3:value3\u 1,标题4 :value4_1,heading5:value5_1],[heading1:value1_2, 标题2:value2\u 2,标题3:value3\u 2,标题4:va

我的csv数据如下所示:

标题1,标题2,标题3,标题4,标题5,值1_1,值2_1,值3_1,值4_1,值5_1,值1_2,值2_2,值3_2,值4_2,值5_2

如何读取这些数据并使用Javascript将其转换为这样的数组

[标题1:value1\u 1,标题2:value2\u 1,标题3:value3\u 1,标题4 :value4_1,heading5:value5_1],[heading1:value1_2, 标题2:value2\u 2,标题3:value3\u 2,标题4:value4\u 2,标题5 :值5_2]

我试过这个密码,但没有成功!:

<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(/\r\n|\n/);
    };

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

var-allText=[];
var allTextLines=[];
var行=[];
var txtFile=new XMLHttpRequest();
打开(“GET”,“file://d:/data.txt”,true);
txtFile.onreadystatechange=函数()
{
allText=txtFile.responseText;
allTextLines=allText.split(/\r\n |\n/);
};
文件。写入(所有文本行)
文件。编写(所有文本)
文件写入(txtFile)

注意:在提醒我有效CSV文件中可能出现的所有“特殊情况”(如转义引号)之前,我调制了此解决方案。我把我的答案留给那些想要快速而肮脏的东西的人,但我推荐准确的答案


当您的
data.txt
文件是一长串逗号分隔的条目,没有换行符时,此代码将起作用:

data.txt:

 heading1,heading2,heading3,heading4,heading5,value1_1,...,value5_2
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 record_num = 5;  // or however many elements there are in each row
    var allTextLines = allText.split(/\r\n|\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);
}
$(document).ready(function() {
    $.ajax({
        type: "GET",
        url: "data.txt",
        dataType: "text",
        success: function(data) {processData(data);}
     });
});

function processData(allText) {
    var allTextLines = allText.split(/\r\n|\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);
}
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(/\r\n|\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);
}
$(document).ready(function() {
    $.ajax({
        type: "GET",
        url: "data.txt",
        dataType: "text",
        success: function(data) {processData(data);}
     });
});

function processData(allText) {
    var allTextLines = allText.split(/\r\n|\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);
}
$(文档).ready(函数(){
$.ajax({
键入:“获取”,
url:“data.txt”,
数据类型:“文本”,
成功:函数(数据){processData(数据);}
});
});
函数processData(allText){
var allTextLines=allText.split(/\r\n |\n/);
var headers=allTextLines[0]。拆分(',');
var行=[];
对于(var i=1;i

,根据

我通过将1更改为0来实现这一点:

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

for(var i=1;i无需编写自己的…

"Harry\nPotter","21","Gryffindor"
该库有一个名为
$.csv.toObjects(csv)
的函数,可以自动进行映射

注意:该库设计用于处理任何符合要求的CSV数据,包括大多数“简单”解决方案忽略的所有令人讨厌的边缘情况

正如@Blazemonger已经说过的,首先需要添加换行符以使数据有效

使用以下数据集:

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" }
]
Harry
Potter,21,Gryffindor
使用代码:

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" }
]
Harry
Potter,21,Gryffindor
保存在“数据”中的输出将为:

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" }
]
Harry
Potter,21,Gryffindor
注意:从技术上讲,您编写键值映射的方式是无效的JavaScript。包含键值对的对象应该用括号括起来

如果您想亲自尝试,我建议您查看“ToObject()”选项卡下的

免责声明:我是jQuery 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" }
]
Harry
Potter,21,Gryffindor
编辑以使用op提供的数据集,并包含指向演示的链接,在该链接中可以测试数据的有效性

更新2:

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" }
]
Harry
Potter,21,Gryffindor

由于谷歌代码的关闭。

< P>不要在逗号上拆分,这对于大多数CSV文件来说是行不通的,这个问题对于ASKER的输入数据有太多的看法,适用于每个人。因为没有真正的官方标准,解析CSV有点吓人,很多划界的文本作者不考虑边缘情况。 这个问题由来已久,但我相信现在有一个更好的解决方案。这是我在贡献者的帮助下编写的一个库,可以解析CSV文本或文件。这是我所知道的唯一一个支持千兆字节大小文件的JS库。它还可以优雅地处理格式错误的输入

1分钟内解析1 GB文件:

更新:使用Papa Parse 4,相同的文件在Firefox中只需30秒。Papa Parse 4现在用于浏览器。)

解析文本非常简单:

var data = Papa.parse(csvString);
解析文件也很容易:

Papa.parse(file, {
    complete: function(results) {
        console.log(results);
    }
});
流文件与此类似(以下是流式传输远程文件的示例):

如果您的网页在解析过程中被锁定,Papa可以使用web workers使您的网站保持被动


如果存在标题行,Papa可以自动检测分隔符并将值与标题列进行匹配。它还可以将数值转换为实际的数字类型。它可以适当地解析换行符、引号和其他奇怪的情况,甚至可以尽可能可靠地处理格式错误的输入。我从现有库中汲取灵感,以ake Papa,因此支持其他JS实现。

这里有一个JavaScript函数,用于解析CSV数据,并考虑引号中的逗号

// 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",bar\n2,3\n"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));
以下是如何将数据转换为对象,例如(这是一个可靠的第三方解决方案):

这是一个例子


享受!

这里是另一种将外部CSV读入Javascript的方法(使用jQuery)

这有点冗长,但我觉得通过将数据读取到阵列中,您可以完全按照流程进行操作,从而简化故障排除

可能会帮助别人

数据文件示例:

Time,data1,data2,data2
08/11/2015 07:30:16,602,0.009,321
代码如下:

$(document).ready(function() {
 // AJAX in the data file
    $.ajax({
        type: "GET",
        url: "data.csv",
        dataType: "text",
        success: function(data) {processData(data);}
        });

    // Let's process the data from the data file
    function processData(data) {
        var lines = data.split(/\r\n|\n/);

        //Set up the data arrays
        var time = [];
        var data1 = [];
        var data2 = [];
        var data3 = [];

        var headings = lines[0].split(','); // Splice up the first row to get the headings

        for (var j=1; j<lines.length; j++) {
        var values = lines[j].split(','); // Split up the comma seperated values
           // We read the key,1st, 2nd and 3rd rows 
           time.push(values[0]); // Read in as string
           // Recommended to read in as float, since we'll be doing some operations on this later.
           data1.push(parseFloat(values[1])); 
           data2.push(parseFloat(values[2]));
           data3.push(parseFloat(values[3]));

        }

    // For display
    var x= 0;
    console.log(headings[0]+" : "+time[x]+headings[1]+" : "+data1[x]+headings[2]+" : "+data2[x]+headings[4]+" : "+data2[x]);
    }
})
$(文档).ready(函数(){
//数据文件中的AJAX
$.ajax({
键入:“获取”,
url:“data.csv”,
数据类型:“文本”,
成功:函数(数据){processData(数据);}
});
//让我们来处理数据文件中的数据
函数processData(数据){
var lines=data.split(/\r\n |\n/);
//设置数据数组
var时间=[];
VarData1=[];
VarData2=[];
VarData3=[];
var headers=行[0]。拆分(',);//拼接第一行以获取标题
对于(var j=1;j
我希望尽可能多地使用正则表达式。该正则表达式将所有项视为带引号或不带引号,后跟列分隔符或行分隔符。或文本结尾

这就是为什么最后一个条件