我有一个由html+javascript制作的网页,这是一个演示页面。我想知道如何读取本地csv文件并逐行读取,以便从csv文件中提取数据。
我有一个由html+javascript制作的网页,这是一个演示页面。我想知道如何读取本地csv文件并逐行读取,以便从csv文件中提取数据。
没有jQuery:
const $output = document.getElementById('output')
document.getElementById('file').onchange = function() {
var file = this.files[0];
var reader = new FileReader();
reader.onload = function(progressEvent) {
// Entire file
const text = this.result;
$output.innerText = text
// By lines
var lines = text.split('\n');
for (var line = 0; line < lines.length; line++) {
console.log(lines[line]);
}
};
reader.readAsText(file);
};
<input type="file" name="file" id="file">
<div id='output'>
...
</div>
记得在文件字段渲染后放置您的 JavaScript 代码。
\n
时发出事件。但是对于100m行,你会遇到在HTML中显示它们的表格问题。 - Tomáš Zato使用ES6,JavaScript会变得更加简洁。
handleFiles(input) {
const file = input.target.files[0];
const reader = new FileReader();
reader.onload = (event) => {
const file = event.target.result;
const allLines = file.split(/\r\n|\n/);
// Reading line by line
allLines.forEach((line) => {
console.log(line);
});
};
reader.onerror = (event) => {
alert(event.target.error.name);
};
reader.readAsText(file);
}
\r?\n
。 - cevingconst allLines = file.split(/\r\n|\n/);
- 这并不是真正的“逐行读取”。这是一次性读取整个多GB文件,导致程序崩溃。 - Ark-kunfetch
,但如果你已经有了一个File,你可以调用stream()
和getReader()
来代替。async function* makeTextFileLineIterator(fileURL) {
const utf8Decoder = new TextDecoder("utf-8");
let response = await fetch(fileURL);
let reader = response.body.getReader();
let { value: chunk, done: readerDone } = await reader.read();
chunk = chunk ? utf8Decoder.decode(chunk, { stream: true }) : "";
let re = /\r\n|\n|\r/gm;
let startIndex = 0;
for (;;) {
let result = re.exec(chunk);
if (!result) {
if (readerDone) {
break;
}
let remainder = chunk.substr(startIndex);
({ value: chunk, done: readerDone } = await reader.read());
chunk =
remainder + (chunk ? utf8Decoder.decode(chunk, { stream: true }) : "");
startIndex = re.lastIndex = 0;
continue;
}
yield chunk.substring(startIndex, result.index);
startIndex = re.lastIndex;
}
if (startIndex < chunk.length) {
// last line didn't end in a newline char
yield chunk.substr(startIndex);
}
}
for await (let line of makeTextFileLineIterator(urlOfFile)) {
processLine(line);
}