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

Mah*_*mar 175 javascript jquery

我的csv数据如下所示:

标题1,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读取这些数据并转换为这样的数组?:

[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] ....

我试过这段代码但没有运气!:

<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>
Run Code Online (Sandbox Code Playgroud)

Eva*_*ice 194

不需要自己编写......

jQuery的CSV库有一个调用的函数$.csv.toObjects(csv)是自动完成的映射.

注意:该库旨在处理符合RFC 4180的任何CSV数据,包括大多数"简单"解决方案忽略的所有令人讨厌的边缘情况.

就像@Blazemonger已经说过的那样,首先你需要添加换行符以使数据有效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
Run Code Online (Sandbox Code Playgroud)

使用代码:

var data = $.csv.toObjects(csv):
Run Code Online (Sandbox Code Playgroud)

保存在'data'中的输出将是:

[
  { 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" }
]
Run Code Online (Sandbox Code Playgroud)

注意:从技术上讲,您编写键值映射的方式是无效的JavaScript.包含键值对的对象应该用括号括起来.

如果你想亲自尝试一下,我建议你看一下'toObjects()'选项卡下的Basic Usage Demonstration.

免责声明:我是jQuery-CSV的原作者.

更新:

编辑使用op提供的数据集,并包含一个指向演示的链接,可以测试数据的有效性.

UPDATE2:

由于关闭了Google Code.jquery-csv已移至GitHub

  • CSV是文件名吗? (10认同)
  • 神奇的图书馆.仅供参考,参数`csv`传递的是csv字符串 - 将csv文件作为文本读取以获取csv字符串. (8认同)
  • IOW,"toObject"是或者可以被认为是"toJSON",不是吗?并且,在调用toObjects(csv)之后冒号是一个错字吗?IOW,不应该是分号吗? (3认同)
  • @Evan Plaice如何使用此库从csv文件中读取? (3认同)

Bla*_*ger 109

注意:在我提醒有关CSV文件中可能出现的所有"特殊情况"(例如转义引号)之前,我编制了此解决方案.我想给那些想要快速和肮脏的东西的人留下我的答案,但我建议Evan回答准确性.


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

data.txt中:

 heading1,heading2,heading3,heading4,heading5,value1_1,...,value5_2
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

以下代码适用于"true"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
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$(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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 代码可能无法处理所有有效的IETF标准CSV文件,如果存在包含逗号,换行符或双引号的字符串,则可能会失败.例如,`1,'IETF允许""引号"",逗号和\nline break"`这是允许的,因为字符串被双引号括起来,双引号被转义. (6认同)
  • 顺便说一下,这假设CSV文件确实有多行 - 这就是`allText.split(/\r \n | \n /)`分裂的内容.如果您的所有数据实际上都是一长串逗号分隔数据而没有换行符,则它不是真正的CSV文件. (3认同)
  • 您好,我使用了这段代码:但是没有输出。仅显示空白警报。我的文件如下所示: header1,heading2,heading3,heading4,heading5,value1_1,value2_1,value3_1,value4_1,value5_1,value1_2,value2_2,value3_2,value4_2,value5_2 csv.html 和 data.txt 都在同一文件夹中 (2认同)

Mat*_*att 62

不要在逗号上拆分 - 它对大多数CSV文件都不起作用,而且这个问题对于提问者的输入数据应用于每个人的看法太多了.解析CSV有点可怕,因为没有真正的官方标准,许多分隔的文本编写者不会考虑边缘情况.

这个问题很古老,但我相信现在Papa Parse已经有了更好的解决方案.这是我在贡献者的帮助下编写的一个库,用于解析CSV文本或文件.它是我所知道的唯一支持文件千兆字节大小的JS库.它还可以优雅地处理格式错误的输入.

1分钟内解析1 GB文件: 1分钟内解析1 GB文件

(更新:使用Papa Parse 4,同一个文件在Firefox中只用了大约30秒.Papa Parse 4现在是浏览器中最快的已知CSV解析器.)

解析文本非常简单:

var data = Papa.parse(csvString);
Run Code Online (Sandbox Code Playgroud)

解析文件也很简单:

Papa.parse(file, {
    complete: function(results) {
        console.log(results);
    }
});
Run Code Online (Sandbox Code Playgroud)

流文件类似(这是流式传输远程文件的示例):

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

如果您的网页在解析过程中锁定,Papa可以使用Web工作人员来保持您的网站被动.

如果存在标题行,Papa可以自动检测分隔符并将值与标题列匹配.它还可以将数值转换为实际数字类型.它适当地解析换行符和引号以及其他奇怪的情况,甚至可以尽可能稳健地处理格式错误的输入.我从现有的库中汲取灵感来制作Papa,这是其他JS实现的道具.

  • @EvanPlaice谢谢.您可能会喜欢我昨晚在本地聚会上发表的演示文稿:https://docs.google.com/presentation/d/1bmK96ETMtUHG3LFU2sN05ztrdLDq-5WJwJOJttQ515Y/edit?usp=sharing (3认同)

Bim*_*Grg 8

我正在使用d3.js来解析csv文件.非常好用.这是文档.

脚步:

  • npm install d3-request

使用Es6;

import { csv } from 'd3-request';
import url from 'path/to/data.csv';

csv(url, function(err, data) {
 console.log(data);
})
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅文档.

更新 - 不推荐使用d3-request.你可以使用d3-fetch


San*_*ers 6

您可以使用 PapaParse 来提供帮助。 https://www.papaparse.com/

这是一个 CodePen。 https://codepen.io/sandro-wiggers/pen/VxrxNJ

Papa.parse(e, {
            header:true,
            before: function(file, inputElem){ console.log('Attempting to Parse...')},
            error: function(err, file, inputElem, reason){ console.log(err); },
            complete: function(results, file){ $.PAYLOAD = results; }
        });
Run Code Online (Sandbox Code Playgroud)


cur*_*ran 5

这是一个解析 CSV 数据的 JavaScript 函数,考虑引号内的逗号。

// 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;                                                      
}
Run Code Online (Sandbox Code Playgroud)

使用该函数解析 CSV 文件的示例,如下所示:

"foo, the column",bar
2,3
"4, the value",5
Run Code Online (Sandbox Code Playgroud)

成数组:

// 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));
Run Code Online (Sandbox Code Playgroud)

以下是将数据转换为对象的方法,例如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));
Run Code Online (Sandbox Code Playgroud)

是这段代码工作小提琴

享受!--柯兰


小智 5

如果您想在不使用Ajax 的情况下解决此问题,请使用FileReader()Web API

实施示例:

  1. 选择.csv文件
  2. 查看输出

function readSingleFile(e) {
  var file = e.target.files[0];
  if (!file) {
    return;
  }

  var reader = new FileReader();
  reader.onload = function(e) {
    var contents = e.target.result;
    displayContents(contents);
    displayParsed(contents);
  };
  reader.readAsText(file);
}

function displayContents(contents) {
  var element = document.getElementById('file-content');
  element.textContent = contents;
}

function displayParsed(contents) {
  const element = document.getElementById('file-parsed');
  const json = contents.split(',');
  element.textContent = JSON.stringify(json);
}

document.getElementById('file-input').addEventListener('change', readSingleFile, false);
Run Code Online (Sandbox Code Playgroud)
<input type="file" id="file-input" />

<h3>Raw contents of the file:</h3>
<pre id="file-content">No data yet.</pre>

<h3>Parsed file contents:</h3>
<pre id="file-parsed">No data yet.</pre>
Run Code Online (Sandbox Code Playgroud)