gpt4 book ai didi

javascript - 尝试用javascript实现一个简单的文本解析器

转载 作者:行者123 更新时间:2023-11-28 08:28:33 25 4
gpt4 key购买 nike

我正在尝试将一个简单的文本解析器从 Java 引入 Javascript。

要求是将给定的 csv 文件转换为另一种格式。原始文件在某些​​行中根据一个 id 列出了多个值:

例如:
11111; 12; 23; 23;....
11111; 32; 12; 12 ;....

所以第一个值是一个Id,其他值根据这个Id。现在我需要同一个文件,其中包含根据单行中的一个 Id 的所有值。结果应该是这样的:
11111;12; 23; 23; 32; 12; 12;....

我已经通过一个简单的 Java 类实现了这一点:

public static void main(String[] args) throws Exception {
PrintWriter writer = new PrintWriter("t2_lines.csv", "UTF-8");
BufferedReader br = new BufferedReader(new FileReader("t2.csv"));

String previousId="";
String line;

while ((line = br.readLine()) != null) {
String [] words = line.split(";");
String id = words[0];
if (previousId.equals(id)){
// the loop starts at 4 to cut out some unneded values
for(int i=4;i<words.length;i++) {
writer.print(words[i]+";");
}
}else{
writer.println("");
for(String word : words)
writer.print(word+";");
previousId = id;
}
}
br.close();
writer.close();
}

现在我尝试通过从客户端读取文件并在文本字段中显示结果来在 Javascript 中重建这个东西 - 但不幸的是我以前从未在 Javascript 中实现过任何东西......

这是我到目前为止的方法:

window.onload = function () {
var fileInput = document.getElementById('fileInput');
var origFileDisplayArea = document.getElementById('origFileDisplayArea');
var reformatFileDisplayArea= document.getElementById('reformatFileDisplayArea');

fileInput.addEventListener('change', function (e) {
var file = fileInput.files[0];
var textType = /text.*/;

if (file.type.match(textType)) {
var reader = new FileReader();

reader.readAsText(file);

reader.onload = function (e) {
var result = reader.result;
var table = parse(result);
origFileDisplayArea.innerText = table;
}
} else {
origFileDisplayArea.innerText = "File not supported!"
}
});
}

function parse(input) {
var previousId = "";
var table = "";
if (typeof input !== "undefined")
var lines = input.split("\n");
for (var i = 0; i <= lines.length; i++) {
var line = lines[i];
if (typeof line !== "undefined")
var words = line.split(";");
console.log("words length: ", words.length);
for (var j = 0; j <= words.length; j++ ) {
var word = words[j];

if (typeof word !== "undefined") {
word.toString();
var id = words[0];
if (previousId === id) {
for (var jj = 4; jj <=words.length; jj++){
console.log("jj: " + jj)
table += words[jj]+";";
}
}else {
table += "\n";
for (var word in words) {
table += word + ";";
previousId = id;
}
}
}
}


}

return table;
}

但不幸的是,我现在陷入了未定义的值,整个过程需要很长时间才能运行。

因此,任何提示/帮助将不胜感激。提前致谢

最佳答案

是的,对于FileReader,我看不到在这种情况下避免这种情况的方法。这看起来不像是您遇到问题的地方。

至于parsesplit方法会占用大量内存,所以我会避免在整个文件上使用它,for.. in 不是为循环数组而设计的。

function parse(str_in) {
var i = -1, j = -1,
str_out = '',
last_id = '',
words;
str_in += '\n'; // not sure if necessary - let the last line pass `while`
// loop by seeking out the next new line
// i = old_index + 1
// j = next \n after old_index
// .slice(i, j) gives just the line
while (-1 !== (j = str_in.indexOf('\n', i = j + 1))) {
words = str_in.slice(i, j).split(';')
// loop words to trim whitespace here if you want
if (last_id === words[0]) // throw away first item if on the same id
words = words.slice(1);
else {
last_id = words[0];
if (str_out.length) // lazy prevent first char newline
str_out += '\n';
}
str_out += words.join(';'); // if you trimmed witespace, re-add here
// if you don't have a final semicolon, add it too
}
return str_out;
}

现在

parse('11111; 12; 23; 23 ;\n11111; 32; 12; 12 ;');
// "11111; 12; 23; 23 ; 32; 12; 12 ;"
<小时/>

或者,您可能会发现编写类似于 Java 中习惯的方法会更容易,这样您就可以进行最小的更改,例如

function ReadLineGenerator(text) {
var start = -1, end = -1;
return function readLine() {
if (end < start) {
start = end = -1;
return null;
}
start = end + 1;
end = text.indexOf('\n', start);
if (end !== -1)
return text.slice(start, end);
else
return text.slice(start);
};
}
// example usage
var str = 'a\nb\nc',
f = ReadLineGenerator(str),
line;
while (null !== (line = f()))
console.log(line);
// "a", "b", "c" logged
// line === null

关于javascript - 尝试用javascript实现一个简单的文本解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22127892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com