逐行读取文件,每行用空格分隔 javascript
Read file line by line and separate each line by spaces by javascript
我编写了使用 HTML5 Filereader API 读取文件的代码。逐行读取是 done.but 现在我想要做的是从每一行获取单独的数据。
如果我读取如下文件。
2016-8-11 23:13:27 hdhtdht hththth
2016-8-11 23:13:27 edhdhdh ehdhdhd= dhdhd
2016-8-11 23:13:27 dfgdfgdg eagsdrgergared ergargge
2016-8-11 23:13:27 dgbdfhgb gdhdhgddh
2016-8-11 23:13:27 ggggggggggggg gtrrrrrrrrr
我想分别获取一个属性的时间、日期和所有其他详细信息。
{
"_id" : ObjectId("5926c4581d3e69c01f32b074"),
"dat" : "2016-8-11",
"details" : "hdhtdht hththth",
"tim" : "23:13:27"
}
因此,对于每一行,将有三个 attributes.i 尝试使用 spit() method.but 进行拆分,它也将内容分开。
谁能推荐一个方法??
这是我目前写的 javascript 功能。
$scope.addFileContents= function(readDetails)
{
//read line by line
var lines = readDetails.split('\n');
for(var line = 0; line < lines.length; line++){
//separate by spaces
var linesSpace = lines[line].split(' ');
var event = {
dat: linesSpace[0],
tim: linesSpace[1],
details: linesSpace[2],
space:linesSpace[3]
};
Event.ReadUploadFile(event)
.success(function () {
$scope.status = 'Reading the selected file';
$scope.fileDetails.push(event);
}).
error(function (error) {
$scope.status = 'Unable to insert data: ' + error.message;
});
}
}
谢谢。
一种快速的方法是将 split
结果的最后一个元素(在日期和时间之后)连接起来(假设布局始终相同)
var linesSpace = lines[line].split(' ');
var event = {
dat: linesSpace[0],
tim: linesSpace[1],
details: linesSpace.slice(2).join('')
};
使用以下算法:
- 将字符串拆分为单独的 个单词
- 将结果数组的前 2 项移到变量中
- 将剩余的项目合并回一个字符串
示例:
var data = lines[line].split(' ');
var date = data.shift();
var time = data.shift();
var details = data.join(' ');
使用正则表达式分隔字符串,Array.prototype.map()
分隔 event
,因此它不是对象而是数组。演示 1 是我相信它适合您的功能的方式。 Demo 2是实际运行的功能(我不明白你的其余代码。)
Demo 2中有详细说明
演示 1
var readDetails = `2016-8-11 23:13:27 hdhtdht hththth
2016-8-11 23:13:27 edhdhdh ehdhdhd= dhdhd
2016-8-11 23:13:27 dfgdfgdg eagsdrgergared ergargge
2016-8-11 23:13:27 dgbdfhgb gdhdhgddh
2016-8-11 23:13:27 ggggggggggggg gtrrrrrrrrr`;
$scope.addFileContents = function(readDetails) {
var rgx = /(\d{4}-\d?-\d{1,2})\s(\d\d:\d\d:\d\d)\s\s(.*)/g;
var cap = `||`;
var lines = readDetails.split('\n');
var event = lines.map(function(line, idx) {
var data = (line.replace(rgx, cap)).split('|');
var frag = {
date: data[0],
time: data[1],
details: data[2]
};
return frag;
});
console.log(event);
Event.ReadUploadFile(event)
.success(function() {
$scope.status = 'Reading the selected file';
$scope.fileDetails.push(event);
}).
error(function(error) {
$scope.status = 'Unable to insert data: ' + error.message;
});
}
演示 2
var readDetails = `2016-8-11 23:13:27 hdhtdht hththth
2016-8-11 23:13:27 edhdhdh ehdhdhd= dhdhd
2016-8-11 23:13:27 dfgdfgdg eagsdrgergared ergargge
2016-8-11 23:13:27 dgbdfhgb gdhdhgddh
2016-8-11 23:13:27 ggggggggggggg gtrrrrrrrrr`;
/* Sloppy regex:
{4 digits}-{ 1 or 2 digits}-{1 to 2 digits}{space}
{2 digits}:{2 digits}:{2 digits}{2 spaces}{Anything until end of line}
*/
var rgx = /(\d{4}-\d?-\d{1,2})\s(\d\d:\d\d:\d\d)\s\s(.*)/g;
/* 3 capture groups delimited by a "|"
|| If you need to have any repetitive text included in each line
|| this is a good place to insert it.
*/
var cap = `||`;
// An array of strings
var lines = readDetails.split('\n');
// map() each string of array to...
var event = lines.map(function(line, idx) {
/* replace() each match on string so that it's
|| split() 3 ways delimited by the "|"
*/
var data = (line.replace(rgx, cap)).split('|');
/* The 3 new strings are assigned to a property
|| of an object literal
*/
var frag = {
date: data[0],
time: data[1],
details: data[2]
};
/* Each object literal is then returned as an
|| element of an array
*/
return frag;
});
console.log(event);
我编写了使用 HTML5 Filereader API 读取文件的代码。逐行读取是 done.but 现在我想要做的是从每一行获取单独的数据。
如果我读取如下文件。
2016-8-11 23:13:27 hdhtdht hththth
2016-8-11 23:13:27 edhdhdh ehdhdhd= dhdhd
2016-8-11 23:13:27 dfgdfgdg eagsdrgergared ergargge
2016-8-11 23:13:27 dgbdfhgb gdhdhgddh
2016-8-11 23:13:27 ggggggggggggg gtrrrrrrrrr
我想分别获取一个属性的时间、日期和所有其他详细信息。
{
"_id" : ObjectId("5926c4581d3e69c01f32b074"),
"dat" : "2016-8-11",
"details" : "hdhtdht hththth",
"tim" : "23:13:27"
}
因此,对于每一行,将有三个 attributes.i 尝试使用 spit() method.but 进行拆分,它也将内容分开。 谁能推荐一个方法??
这是我目前写的 javascript 功能。
$scope.addFileContents= function(readDetails)
{
//read line by line
var lines = readDetails.split('\n');
for(var line = 0; line < lines.length; line++){
//separate by spaces
var linesSpace = lines[line].split(' ');
var event = {
dat: linesSpace[0],
tim: linesSpace[1],
details: linesSpace[2],
space:linesSpace[3]
};
Event.ReadUploadFile(event)
.success(function () {
$scope.status = 'Reading the selected file';
$scope.fileDetails.push(event);
}).
error(function (error) {
$scope.status = 'Unable to insert data: ' + error.message;
});
}
}
谢谢。
一种快速的方法是将 split
结果的最后一个元素(在日期和时间之后)连接起来(假设布局始终相同)
var linesSpace = lines[line].split(' ');
var event = {
dat: linesSpace[0],
tim: linesSpace[1],
details: linesSpace.slice(2).join('')
};
使用以下算法:
- 将字符串拆分为单独的 个单词
- 将结果数组的前 2 项移到变量中
- 将剩余的项目合并回一个字符串
示例:
var data = lines[line].split(' ');
var date = data.shift();
var time = data.shift();
var details = data.join(' ');
使用正则表达式分隔字符串,Array.prototype.map()
分隔 event
,因此它不是对象而是数组。演示 1 是我相信它适合您的功能的方式。 Demo 2是实际运行的功能(我不明白你的其余代码。)
Demo 2中有详细说明
演示 1
var readDetails = `2016-8-11 23:13:27 hdhtdht hththth
2016-8-11 23:13:27 edhdhdh ehdhdhd= dhdhd
2016-8-11 23:13:27 dfgdfgdg eagsdrgergared ergargge
2016-8-11 23:13:27 dgbdfhgb gdhdhgddh
2016-8-11 23:13:27 ggggggggggggg gtrrrrrrrrr`;
$scope.addFileContents = function(readDetails) {
var rgx = /(\d{4}-\d?-\d{1,2})\s(\d\d:\d\d:\d\d)\s\s(.*)/g;
var cap = `||`;
var lines = readDetails.split('\n');
var event = lines.map(function(line, idx) {
var data = (line.replace(rgx, cap)).split('|');
var frag = {
date: data[0],
time: data[1],
details: data[2]
};
return frag;
});
console.log(event);
Event.ReadUploadFile(event)
.success(function() {
$scope.status = 'Reading the selected file';
$scope.fileDetails.push(event);
}).
error(function(error) {
$scope.status = 'Unable to insert data: ' + error.message;
});
}
演示 2
var readDetails = `2016-8-11 23:13:27 hdhtdht hththth
2016-8-11 23:13:27 edhdhdh ehdhdhd= dhdhd
2016-8-11 23:13:27 dfgdfgdg eagsdrgergared ergargge
2016-8-11 23:13:27 dgbdfhgb gdhdhgddh
2016-8-11 23:13:27 ggggggggggggg gtrrrrrrrrr`;
/* Sloppy regex:
{4 digits}-{ 1 or 2 digits}-{1 to 2 digits}{space}
{2 digits}:{2 digits}:{2 digits}{2 spaces}{Anything until end of line}
*/
var rgx = /(\d{4}-\d?-\d{1,2})\s(\d\d:\d\d:\d\d)\s\s(.*)/g;
/* 3 capture groups delimited by a "|"
|| If you need to have any repetitive text included in each line
|| this is a good place to insert it.
*/
var cap = `||`;
// An array of strings
var lines = readDetails.split('\n');
// map() each string of array to...
var event = lines.map(function(line, idx) {
/* replace() each match on string so that it's
|| split() 3 ways delimited by the "|"
*/
var data = (line.replace(rgx, cap)).split('|');
/* The 3 new strings are assigned to a property
|| of an object literal
*/
var frag = {
date: data[0],
time: data[1],
details: data[2]
};
/* Each object literal is then returned as an
|| element of an array
*/
return frag;
});
console.log(event);