[英]Convert CSV data into JSON format using Javascript
我有 CSV 格式的數據,想使用 Javascript 轉換成 JSON 格式。
以下是 csv 格式:
[Test.csv]
id;name;author
integer;string;authors:n
1;To Kill an Angry Bird;1
[authors.csv]
id;name
integer;string
1;Harper Lee
2;JRR Tolkien
3;William Shakespeare
我想和他們的作者一起得到所有的書。 那么請問如何使用 Javascript 來實現它。
以下應該適合你。
全部歸功於http://techslides.com/convert-csv-to-json-in-javascript
//var csv is the CSV file with headers
function csvJSON(csv){
var lines=csv.split("\n");
var result = [];
// NOTE: If your columns contain commas in their values, you'll need
// to deal with those before doing the next step
// (you might convert them to &&& or something, then covert them back later)
// jsfiddle showing the issue https://jsfiddle.net/
var headers=lines[0].split(",");
for(var i=1;i<lines.length;i++){
var obj = {};
var currentline=lines[i].split(",");
for(var j=0;j<headers.length;j++){
obj[headers[j]] = currentline[j];
}
result.push(obj);
}
//return result; //JavaScript object
return JSON.stringify(result); //JSON
}
我會看看PapaParse 。 他們有一個名為papaparse.min.js
的文件,如果需要,您可以將其放入您的項目中。 PapaParse 沒有依賴項。
我自己使用過它,可以驗證它的工作原理,方便,並且有據可查。
基於@DelightedD0D,我會添加if (!lines[i]) continue
以便它可以忽略任何空行和尾隨行。
function csvJSON(csv) {
const lines = csv.split('\n')
const result = []
const headers = lines[0].split(',')
for (let i = 1; i < lines.length; i++) {
if (!lines[i])
continue
const obj = {}
const currentline = lines[i].split(',')
for (let j = 0; j < headers.length; j++) {
obj[headers[j]] = currentline[j]
}
result.push(obj)
}
return result
}
我想,我有一個更好的解決方案,這也有一個問題,即值不應包含逗號(,)。 否則它是最好的解決方案。
// convert csv to json
csvJSON(csvText) {
let lines = [];
const linesArray = csvText.split('\n');
// for trimming and deleting extra space
linesArray.forEach((e: any) => {
const row = e.replace(/[\s]+[,]+|[,]+[\s]+/g, ',').trim();
lines.push(row);
});
// for removing empty record
lines.splice(lines.length - 1, 1);
const result = [];
const headers = lines[0].split(",");
for (let i = 1; i < lines.length; i++) {
const obj = {};
const currentline = lines[i].split(",");
for (let j = 0; j < headers.length; j++) {
obj[headers[j]] = currentline[j];
}
result.push(obj);
}
//return result; //JavaScript object
// return JSON.stringify(result); //JSON
return result;
}
// For Reading CSV File
readCSV(event) {
const reader = new FileReader();
reader.readAsText(event.files[0]);
reader.onload = () => {
const text = reader.result;
const csvToJson = this.csvJSON(text);
console.log(csvToJson);
};
}
謝謝
這是我對您的特定示例的嘗試。 我知道這是一個老問題,但我使用了當前的方法
const titlesCsv = `id;name;author integer;string;authors:n 1;To Kill an Mockingbird;1 2;Lord of the Rings;2 3;Hamlet;3` const authorsCsv = `id;name integer;string 1;Harper Lee 2;JRR Tolkien 3;William Shakespeare` const parseCsv = csv => { let lines = csv.split("\\n"); const header = lines.shift().split(";") lines.shift(); // get rid of definitions return lines.map(line => { const bits = line.split(";") let obj = {}; header.forEach((h, i) => obj[h] = bits[i]); // or use reduce here return obj; }) }; const titles = parseCsv(titlesCsv) const authors = parseCsv(authorsCsv) const books = titles.map(title => { return { id: title.id, name: title.name, author: authors.find(author => author.id === title.author).name } }) console.log(books)
我有類似@DelightedD0D 的類似答案,但我的代碼可以直接與 Excel 結合使用(從 Excel 復制並粘貼到文本區域)。
function csvUpload(csvText){
//Split all the text into seperate lines on new lines and carriage return feeds
var allTextLines = csvText.split(/\r\n|\n/);
//Split per line on tabs and commas
var headers = allTextLines[0].split(/\t|,/);
var lines = [];
var locations = [];
for (var i=1; i<allTextLines.length; i++) {
var data = allTextLines[i].split(/\t|,/);
if (data.length == headers.length) {
var location = {"device_id":data[0], "address":data[1], "city":data[2]};
locations.push(location);
}
}
return locations;
}
這樣您就可以使用復制到 Excel 中的 CSV。 Excel 將刪除 , 等分隔符,
並插入換行符等。
使用我的代碼,您可以直接從 Excel 將所有內容傳遞到文本字段中,然后使用它來創建一個 json。
我在這里為靜態字段命名,但您可以使用@DelightedD0D 的代碼動態設置標題:
for(var j=0;j<headers.length;j++){
obj[headers[j]] = currentline[j];
}
此解決方案修復了逗號問題。
function csvJSON(text, quoteChar = '"', delimiter = ',') {
var rows=text.split("\n");
var headers=rows[0].split(",");
const regex = new RegExp(`\\s*(${quoteChar})?(.*?)\\1\\s*(?:${delimiter}|$)`, 'gs');
const match = line => [...line.matchAll(regex)]
.map(m => m[2])
.slice(0, -1);
var lines = text.split('\n');
const heads = headers ?? match(lines.shift());
lines = lines.slice(1);
return lines.map(line => {
return match(line).reduce((acc, cur, i) => {
// replace blank matches with `null`
const val = cur.length <= 0 ? null : Number(cur) || cur;
const key = heads[i] ?? `{i}`;
return { ...acc, [key]: val };
}, {});
});
}
var csvtojson = csvJSON(SOME_CSV_DATA);
console.log(csvtojson)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.