如何在客户端JavaScript中读取本地CSV文件?

10

我有一段客户端JavaScript代码,希望从本地csv文件中读取内容。在HTML代码中,我使用脚本标签导入另一个文件夹中的JavaScript文件。

该JavaScript文件的内容:

$.ajax({
    type: "GET",
    url: "./../../data/English.csv",
    dataType: "text",
    success: function(data) {
        alert("worked");
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
 });

CSV文件的路径是相对于HTML文件的。然而,错误函数已被触发。有没有解决方法?

谢谢。


1
https://dev59.com/tW445IYBdhLWcg3wRoLH - Lawrence Liu
什么是错误信息?你是在本地文件系统还是服务器上运行这个程序? - TimHayes
本地系统,错误消息为空字符串。 - omega
@Lawrence,这是来自filepicker的代码,如果我有相对路径,我该如何将其硬编码到JavaScript中? - omega
请参考https://dev59.com/M2445IYBdhLWcg3wpLx_,了解ajax调用中的相对路径。 - SquareCat
4个回答

4

2
链接固然很好,但单靠它们本身并不是很有用。如果您能在回答正文中解释如何使用链接资源来解决OP的具体问题,那将会更加有帮助。 - Pops
@Pops,有总比没有好吧?教程会比仅分享链接更有帮助,但分享我知道的库的链接应该比直接跳过更有帮助。 - Gaurav
嗨,我使用PapaParse,但我讨厌官方网站。看起来他们更新了版本,但只部分更新了文档。一些函数的工作与他们描述的不符。但是这里有一篇好的文章教程可以创建一个有效的示例。http://www.joyofdata.de/blog/parsing-local-csv-file-with-javascript-papa-parse/ - Yevgeniy Afanasyev

1
Ajax用于与远程服务器交互。由于用户必须同意访问本地文件,因此直接访问本地文件在安全上被阻止。可接受的方法是通过文件选择器UI并让用户选择文件,而不是软件预先指定位置。
我在GitHub上分享了一个库html5csv.js [许可证:GPLv3],它依赖于jQuery,并以各种方式操作本地CSV或表格数据。
这里有一个jsfiddle示例,演示如何使用文件选择器从本地csv文件中选择和显示表格 从主页面开始:https://github.com/DrPaulBrewer/html5csv/blob/master/README.md 要向CSV应用程序“上传”来自用户的CSV数据文件:
HTML
<input type='file' id='choose' />

Javascript(在加载jQuery和html5csv库之后)

CSV.begin('#choose').....go();

..... 不是字面意义上的 .....,而是一串其他html5csv.js库调用的字符串(请参见入门页面维基),用于访问和操作返回的数据。该语句定义了一个异步工作流程,从获取数据开始,然后进行每个调用,并将go()链接以指示启动工作流程。

假设您已经编写了一个

function show(rows)

在您的代码中,用于对CSV数据执行某些操作并显示它,其中预期rows是表示读取CSV文件后行的数组的数组。

您的html5csv.js库调用(使用上述HTML文件选择元素)可能如下:

CSV.begin('#choose')
    .go(function(e,D){ 
       if(e) return console.log(e); 
       show(D.rows); 
      });

可用的库功能包括制作表格、编辑、通过与 jqPlot 集成进行绘图、调用用户定义的函数、线性拟合和 PCA。


看起来有点复杂,你能否为这个问题创建一个 jsfiddle? - Yevgeniy Afanasyev
@YevgeniyAfanasyev 请查看上面发布的编辑和jsfiddle。 - Paul

1
我在Chrome上尝试了以下示例:
    <html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript"></script>
</head>
<body>
test this
</body>
<script>
$.ajax({
    type: "GET",
    url: "English.csv",
    dataType: "text",
    success: function(data) {
        alert("worked");
    },
    error: function (request, status, error) {
        alert(request.responseText);
    }
 });
 </script>

我在控制台看到以下错误:

XMLHttpRequest无法加载file:///C:/temp/local/English.csv。请求的资源上没有'Access-Control-Allow-Origin'头。因此,源'null'不允许访问。

请参见此答案以获取更多详细信息。

如果您只想在开发环境中使其工作,则可以尝试使用以下命令启动Chrome:

chrome.exe --allow-file-access-from-files

另一种选择是尝试:

    <html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js" type="text/javascript"></script>
</head>
<body>
test this
</body>
<script>

$.ajaxPrefilter( 'script', function( options ) {
    options.crossDomain = true;
});

$.ajax({
    type: "GET",
    url: "English.csv",
    dataType: "script",
    success: function(data) {
        alert("worked");
    },
    error: function (request, status, error) {
        
        alert(error);
    }
 });

 </script>

那么你对“有没有办法解决这个问题?”的回答是……? - nnnnnn
我尝试使用“chrome.exe --allow-file-access-from-files”启动Chrome,对我有效。请记得在尝试此操作之前关闭所有Chrome实例。 - Tarun Gupta

0

启动一个测试服务器。

即使您正在本地进行测试,也需要这样做。如果您只是直接在浏览器中打开源文件,ajax 将无法工作。它需要一个服务器来反弹请求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接