从简单的3行CSV获取Javascript数据的最佳方法
我有一个简单的CSV(使用JQuery的从简单的3行CSV获取Javascript数据的最佳方法,javascript,json,csv,Javascript,Json,Csv,我有一个简单的CSV(使用JQuery的$.ajax从同一站点上的/data/league.CSV导入),有三行完全相同的格式: "Kimberlin Library","Queen's Building","Innovation Centre","etc etc" 8,2,0,-2 1,0,-1,0 我想采用这种格式(使用building和percent作为Highcharts中x-y轴的数据,并用这三个数据填充列表): 令人尴尬的琐碎,但我一直画空白,尽管我尝试了其他人的方法(包括拆分(/
$.ajax
从同一站点上的/data/league.CSV
导入),有三行完全相同的格式:
"Kimberlin Library","Queen's Building","Innovation Centre","etc etc"
8,2,0,-2
1,0,-1,0
我想采用这种格式(使用building
和percent
作为Highcharts中x-y轴的数据,并用这三个数据填充列表):
令人尴尬的琐碎,但我一直画空白,尽管我尝试了其他人的方法(包括
拆分(/\r\n |\n | r/)
,搜索/^(.*)$/m
),所以准备从头开始。我需要尽可能简单的东西,JQuery或纯Javascript。对于一个类似的问题,我最终将文件转换为JSON,但如果可能的话,我希望避免这种情况。假设您的CSV很简单,您可能希望执行以下操作:
建筑
数组parseInt
对第二部分进行解析后,将其附加到百分比
数组中change
数组执行相同的操作试试这个。它将通过下面代码中的正则表达式模式处理简单的CSV、单引号或双引号CSV。您必须调整
processCSV()
的结尾以执行所需操作,因为我只是将对象返回到稀薄的空气中
$(document).ready(function() {
$.ajax({
type: "GET",
url: "my_csv.txt",
dataType: "text",
success: function(data) {processCSV(data);}
});
});
function processCSV(allLines) {
var allLinesArray = allLines.split(/\r\n|\n/);
var leaguetable = { 'building': [], 'percent': [], 'change': [] };
var pattern = /([^,'"]*"[^"]*"[^,'"]*)|([^,'"]*'[^']*'[^,'"]*)|([^,"']*)/ig;
var fieldValues;
for (var i=0; i<allLinesArray.length; i++) {
fieldValues = allLinesArray[i].match(pattern);
if (fieldValues) {
for (var j=0; j<fieldValues.length; j++) {
// if begins with single- or double-quote, strip specified quotes
if (fieldValues[j].charAt(0) === '"' || fieldValues[j].charAt(0) === "'") {
fieldValues[j] = fieldValues[j].replace(fieldValues[j].substr(0,1), "");
}
}
// I'll trust your CSV to have the right number of fields, but...
// you may want to build some validation in before doing the next 3 lines
leaguetable.building.push(fieldValues[1]);
leaguetable.percent.push(fieldValues[2]);
leaguetable.change.push(fieldValues[3]);
}
}
return leaguetable;
}
$(文档).ready(函数(){
$.ajax({
键入:“获取”,
url:“my_csv.txt”,
数据类型:“文本”,
成功:函数(数据){processCSV(数据);}
});
});
函数processCSV(所有行){
var allLinesArray=allLines.split(/\r\n |\n/);
var leaguetable={'building':[],'percent':[],'change':[]};
变量模式=/([^,“]*”[^,“]*”[^,“]*)|([^,“]*”[^']*”[^,“]*)|([^,“]*)/ig;
变量值;
对于(var i=0;i您是如何导入CSV的?我只是好奇;为什么您希望它采用这种格式?当您实际处理数据时,我会想象使用包含数据的对象数组比使用包含数据的数组的对象更好。您可以发布CSV的示例吗?有很多不同的varCSV的副本和发布一个示例可能会有所帮助。为什么不使用这样的链接呢?@Wes,Jonathan M:见上文;icktoofay:我直接在Highcharts中使用数组作为轴;Jonathan M:我通常只问自己是否真的被卡住了,但最后自己回答了一些问题;Hemlock:感谢链接如果是引用的CSV,包含数据例如,“我,克劳迪斯”作为书名。但这正是你之前要求提供CSV样本的要点。@Jonathan:这就是为什么我用“假设CSV很简单”来限定我的答案的原因。因为提供的CSV(用于一周的公开展示)需要太多的编辑(没有引号、作为值的标题、多余的字段等),我最终手动将值放入两个数组中。当我们着手更新项目时,这将非常有用。供参考:项目:@Jonathan M此解析器是否可以用于此CSV文件@bouncingHippo,您需要修改代码,因为变量leaguetable
是专门为这个问题设计的。@JonathanM do你介意看看我的问题吗
$(document).ready(function() {
$.ajax({
type: "GET",
url: "my_csv.txt",
dataType: "text",
success: function(data) {processCSV(data);}
});
});
function processCSV(allLines) {
var allLinesArray = allLines.split(/\r\n|\n/);
var leaguetable = { 'building': [], 'percent': [], 'change': [] };
var pattern = /([^,'"]*"[^"]*"[^,'"]*)|([^,'"]*'[^']*'[^,'"]*)|([^,"']*)/ig;
var fieldValues;
for (var i=0; i<allLinesArray.length; i++) {
fieldValues = allLinesArray[i].match(pattern);
if (fieldValues) {
for (var j=0; j<fieldValues.length; j++) {
// if begins with single- or double-quote, strip specified quotes
if (fieldValues[j].charAt(0) === '"' || fieldValues[j].charAt(0) === "'") {
fieldValues[j] = fieldValues[j].replace(fieldValues[j].substr(0,1), "");
}
}
// I'll trust your CSV to have the right number of fields, but...
// you may want to build some validation in before doing the next 3 lines
leaguetable.building.push(fieldValues[1]);
leaguetable.percent.push(fieldValues[2]);
leaguetable.change.push(fieldValues[3]);
}
}
return leaguetable;
}