js如何讀取csv內(nèi)容拼接成json
更新時間:2022年09月28日 16:03:03 作者:Chris_Zk
這篇文章主要介紹了js如何讀取csv內(nèi)容拼接成json,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
js 讀取csv內(nèi)容拼接成json
formdata對象上傳了csv文件,讀取文件內(nèi)容拼接成json對象

var form = new FormData();
var files = $("#getfile")[0].files;
var reader = new FileReader();
reader.readAsText( files[0],"gbk" ); //以文本格式讀取
reader.onload = function(evt){
var data = evt.target.result; //讀到的數(shù)據(jù)
console.log(data);
splitdate = data.split(/\s+/) ;
console.log(splitdate.length)
var arr1=new Array();
var arr2=new Array();
var phone=new Array();
var name=new Array();
for(var i=0;i<splitdate.length;i++){
var data =splitdate[i].split(",");
arr1.push(data[0])
arr2.push(data[2])
}
for(var i=1;i<arr1.length-1;i++){
name.push(arr1[i])
}
for(var i=1;i<arr2.length-1;i++){
phone.push(arr2[i])
}
var userList = [];
for(var i=0;i<name.length;i++){
var json = {};
json.value = name[i];
json.name = phone[i];
console.log(json);
userList.push(json);
}
console.log(userList)
}
最終拼接成為key value格式的json對象
純js讀取txt,xlsx,csv,xls文件
為了減少服務器的壓力,需要前端讀取文件數(shù)據(jù),然后自己拼接分批提交給后臺,這里將讀文件記錄下來
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>讀取文件</title>
<script src="js/shim.js"></script>
<script src="js/xlsx.full.min.js"></script>
<script src="js/jschardet.min.js"></script>
</head>
<body>
<input type='file' value="" id="read" >
</body>
<script>
String.prototype.trim=function(){ //給字符串添加一個去前后空格的方法
return this.replace(/s|xA0/g,"");
}
window.οnlοad=function(){
var file=document.getElementById("read");
file.addEventListener("change",read,false);
/*function resetInpuFile() { //定義一個重置input file控件的方法,否則如果文件不變,不能再次觸發(fā)input控件的onchange事件
var control = event.target;
//control.replaceWith(control = control.clone(true)); //這個重置方法對vue沒用,vue的事件不是直接綁定的,所以復制不了
control.wrap('<form>').closest('form').get(0).reset(); //用一個form包裹input,調(diào)用form的reset方法,然后解除包裹
control.unwrap();
}*/
function read(e){
//獲取文件類型
var filename=e.target.files[0].name;
var phoneStr = '';
var messageContent='';
console.log(filename);
var fileType=filename.substr(filename.lastIndexOf('.')+1,filename.length);
console.log(fileType);
//檢測是瀏覽器是否支持readAsBinaryString函數(shù)
var rABS = typeof FileReader !== 'undefined' && typeof FileReader.prototype !== 'undefined' && typeof FileReader.prototype.readAsBinaryString !== 'undefined';
var reader=new FileReader();
if(rABS){
reader.readAsBinaryString(e.target.files[0]);//發(fā)起異步請求
}else{
reader.readAsArrayBuffer(e.target.files[0]);//發(fā)起異步請求
}
//reader.readAsDataURL(e.target.files[0]);//發(fā)起異步請求
//reader.readAsArrayBuffer(e.target.files[0]);//發(fā)起異步請求
reader.οnlοad=function(e){
var data = e.target.result;
if (fileType == 'txt' || fileType == 'csv') { //txt或csv文件直接讀取
//console.log(data);
var str = null;
var viewBuf = null;
if (rABS) {
str = data; //此時data為binarystring,需要把binarystring轉換為Uint8Array
var newArray = [];
for (var index = 0; index < data.length; index++) {
newArray.push(data.charCodeAt(index));
}
viewBuf = new Uint8Array(newArray);
} else {
viewBuf = new Uint8Array(data); //此時data為ArrayBuffer
for (var index in viewBuf) {
str += String.fromCharCode(viewBuf[index]);
if (index >= 100) { //考慮到效率,只取前1000個用于判斷字符集
break;
}
}
}
//console.log(str);
var codepage = jschardet.detect(str.substring(0, 1000)).encoding;
//console.log(codepage);
if (codepage == 'GB2312' || codepage == 'GB18030') {
codepage = 'GB18030';
} else if (codepage == 'ascii' || codepage == 'UTF-8' || codepage == 'UTF-16BE' || codepage == 'UTF-16LE') {
} else {
alert('不支持的編碼格式:' + codepage + ';你只能使用UTF-8或GB18030(GB2320,GBK)編碼格式文件');
// resetInpuFile();
return;
}
phoneStr = new TextDecoder(codepage).decode(viewBuf);
console.log(phoneStr);
} else if (fileType == 'xls' || fileType == 'xlsx') { //excle文件用js-xlsx解析
function fixdata(data) { //arrayBuffer轉base64字符串
var o = "", l = 0, w = 10240;
for (; l < data.byteLength / w; ++l)
o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
o += String.fromCharCode.apply(null, new Uint8Array(data.slice(o.length)));
return o;
}
function get_columns(sheet, type) { //獲取head頭(excel文件第一行)
var val, rowObject, range, columnHeaders, emptyRow, C;
if (!sheet['!ref']) return [];
range = XLS.utils.decode_range(sheet["!ref"]);
columnHeaders = [];
for (C = range.s.c; C <= range.e.c; ++C) {
val = sheet[XLS.utils.encode_cell({ c: C, r: range.s.r })];
if (!val) continue;
columnHeaders[C] = type.toLowerCase() == 'xls' ? XLS.utils.format_cell(val) : val.v;
//console.log(val, columnHeaders[C]);
}
return columnHeaders;
}
var readtype = { type: rABS ? 'binary' : 'base64' };
if (!rABS) {
arr = fixdata(data);
data = btoa(arr);
}
//console.log('data:' + data);
try {
var workbook = XLSX.read(data, readtype); //workbook.SheetNames[0]是獲取Sheets中第一個Sheet的名字,workbook.Sheets[Sheet名]獲取第一個Sheet的數(shù)據(jù)
} catch (e) {
alert('無法讀取的excel文件,格式錯誤');
resetInpuFile();
return;
}
//console.log(wb);
var XL = fileType.toUpperCase() === 'XLS' ? XLS : XLSX; //選擇是XLS對象還是XLSX對象
workbook.SheetNames.forEach(function (sheetName) {
var roa = XL.utils.sheet_to_json(workbook.Sheets[sheetName], { raw: true });
// console.log(roa);
if (roa.length <= 0) {
return;
}
var columns = get_columns(workbook.Sheets[sheetName], fileType); //獲取本sheet的第一行
var keyName = '';
var keyName1='';
for (var index in columns) { //查看第一行的列里是否有諸如手機號碼這樣列名
//if ($.trim(columns[index]) === '手機號碼') {
if (columns[index].trim() === '手機號碼') {
keyName = columns[index];
continue;
}
//if($.trim(columns[index]) === '短信內(nèi)容'){
if(columns[index].trim() === '短信內(nèi)容'){
keyName1 = columns[index];
continue;
}
}
if (keyName === '') { //沒找到,返回
// console.log('沒找到key');
return;
}
if (keyName1 === '') { //沒找到,返回
// console.log('沒找到key');
return;
}
for (var index=0;index<roa.length;index++) {//這里吧讀出來的數(shù)據(jù)存成字符串
if(roa[index][keyName]!='' && roa[index][keyName1]!=''){
phoneStr += roa[index][keyName] + ',';
messageContent +=(roa[index][keyName1]).replace(/,/g,',')+',';
}
}
//
});
//console.log(phoneStr);
if (phoneStr === '' || messageContent==='') {
alert('沒有在excle文件中找到"手機號碼或者短信內(nèi)容"列');
// resetInpuFile();
return;
}
}
console.log(phoneStr)
console.log(messageContent)
// resetInpuFile();
}
}
}
</script>
</html>這里主要用到h5的fileReader API以及xlsx.js, jschardet.js插件讀取四種類型的文件
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
JS使用Date對象實時顯示當前系統(tǒng)時間簡單示例
這篇文章主要介紹了JS使用Date對象實時顯示當前系統(tǒng)時間,涉及javascript基于定時器動態(tài)操作Date對象相關實現(xiàn)技巧,需要的朋友可以參考下2018-08-08
js open() 與showModalDialog()方法使用介紹
項目開發(fā)中經(jīng)常要用到js open() 與showModalDialog()方法,下面有個不錯的示例,喜歡的朋友可以研究下2013-09-09
JavaScript新引入的原始數(shù)據(jù)類型Symbol詳解
Symbol是ES6中引入的一種新的基本數(shù)據(jù)類型,用于表示一個獨一無二的值。它是JavaScript中的第七種數(shù)據(jù)類型。本文將詳細講講Symbol的使用,需要的可以參考一下2023-01-01
js對象數(shù)組查找某一元素的各種方法(不改變原數(shù)組)
前端經(jīng)常要通過javaScript來處理數(shù)組中的數(shù)據(jù),其中就包括檢查數(shù)組中是否包含滿足特定搜索條件的單個或者多個值,這篇文章主要給大家介紹了關于js對象數(shù)組查找某一元素的各種方法,文中介紹的方法不改變原數(shù)組,需要的朋友可以參考下2024-06-06

