在制表符分隔的文本文件的特定行中搜索制表符

时间:2017-06-29 15:47:43

标签: javascript

我正在使用FileReader API加载制表符分隔的文本文件。一旦加载,我需要找到第一行中的选项卡位置,解析选项卡前面的字符,用解析后的字符做一些事情,然后继续第二行,在第二行的第一个选项卡之前解析出字符,用解析后的字符做一些事情,然后继续第三行,依此类推,直到文件结束。

我不是编码员。我可以在脚本上使用一些帮助来执行这些操作。

更新/修改(根据要求)具体而言,一步一步地采取行动:

  • 我可以加载制表符分隔文件。
  • 我可以逐步浏览文件的行(第15行+)。
  • 我正在逐步完成文件中的行(第15行+)。
  • 但是,当我读取每一行时,我无法执行一系列任务。

在读取每一行时,我想解析第一个制表符前面的行中的字符。在下面的示例文件内容中,我想解析5,然后我希望对5执行操作。之后我想解析10,然后对10执行操作。然后我想解析200并采取行动在200.然后脚本将结束。

我假设读取每一行我想调用另一个函数并将第一行的内容发送到新函数。然后,新函数将在第一个选项卡之前解析出字符。它是否正确?如果没有,那我该怎么办?之后我假设我应该调用另一个函数,它将对解析后的字符执行操作。这是正确的(如果没有,我应该做什么呢?)

如果我是正确的,我应该在读取每行时调用另一个函数,那么我该怎么做(包括发送行的内容)?在显示的代码中,我没有成功地弄清楚如何执行此操作。

谢谢你, 安德鲁

制表符分隔文件的示例:

5   15:00:05    2   1
10  15:00:10    2   2
200 15:03:20    2   3

var fileInput = document.getElementById('fileInput');
    fileInput.addEventListener('change', function (e) {
        var file = fileInput.files[0];
        var textType = /text.*/;
        if (file.type.match(textType)) {
            var reader = new FileReader();
            reader.onload = function (e) {
                // Entire file
                fileDisplayArea.innerText = reader.result;

                // Count of lines in file
                var lines2 = reader.result.split("\n").length;
                fileDisplayArea2.innerText = "The number of lines in the text file is: " + Number(lines2-1);

                // Attempt at an action per line
                var lines = reader.result.split('\n');
                for (var line = 0; line < lines.length; line++) {
                    //console.log(lines[line])
                    //with each line, how can I call another function and send along with the call the contents of the line?
                    fileDisplayArea3.innerText = lines;
                }
            }
            reader.readAsText(file);
        } else {
            fileDisplayArea.innerText = "File not supported!"
        }
    });
Select a text file:
<input type="file" id="fileInput">
<hr />
<pre id="fileDisplayArea"></pre>
<hr />
<pre id="fileDisplayArea2"></pre>
<hr />
<pre id="fileDisplayArea3"></pre>

1 个答案:

答案 0 :(得分:1)

以下是您要执行的操作的示例。循环每一行时,您可以从lines[line]数组中获取lines行的文本。然后,您可以将该文本(以及我的示例中的行号)传递给函数。

在我的示例中,函数为doStuff,然后它将行文本按tab字符拆分,得到一个&#34;单元格数组&#34; (由制表符分隔的行上的值)。我让函数输出值,以便您可以看到它们。你可以随心所欲地做它。

&#13;
&#13;
var fileInput = document.getElementById('fileInput');
    fileInput.addEventListener('change', function (e) {
        var file = fileInput.files[0];
        var textType = /text.*/;
        if (file.type.match(textType)) {
            var reader = new FileReader();
            reader.onload = function (e) {
                // Entire file
                fileDisplayArea.innerText = reader.result;

                // Count of lines in file
                var lines2 = reader.result.split("\n").length;
                fileDisplayArea2.innerText = "The number of lines in the text file is: " + Number(lines2);

                // Attempt at an action per line
                var lines = reader.result.split('\n');
                for (var line = 0; line < lines.length; line++) {
                    doStuff(line, lines[line]);
                    fileDisplayArea3.innerText = lines;
                }
            }
            reader.readAsText(file);
        } else {
            fileDisplayArea.innerText = "File not supported!"
        }
    });
    
    function doStuff(lineNumber, lineText) {
        // do something with the 
      var cells = lineText.split('\t'); // '\t' is a tab character
      cellValues.innerText += "Line: " + (lineNumber + 1) + "\n";
      cells.forEach(function(value) {
          // do something with each "value" that was delimited by the "tab" characters
          // in this example add the value to cellValues
          // you can do whatever you want with the "value" here
          cellValues.innerText += '\t' + value + '\n';
      });
    }
&#13;
Select a text file:
<input type="file" id="fileInput">
<hr />
<pre id="fileDisplayArea"></pre>
<hr />
<pre id="fileDisplayArea2"></pre>
<hr />
<pre id="fileDisplayArea3"></pre>
<hr />
<pre id="cellValues"></pre>
&#13;
&#13;
&#13;

更新:doStuff

的说明

该功能的第一行是var cells = lineText.split('\t');&#34;替换&#34;带逗号的制表符。它的作用是创建一个数组并将其存储到cells变量中。

在原始代码中,此行fileDisplayArea3.innerText = lines;以逗号显示的原因是因为lines数组已转换为字符串以便将其放入innerText。内部javascript调用数组上的toString()方法,该方法输出的元素以逗号分隔

继续。 cells现在是由制表符分隔(分隔)的行的值数组。我们可以使用for循环来迭代行,但我选择使用forEachforEach将遍历(顾名思义)数组的每个元素将其值传递给函数。 value现在可以随心所欲地做任何我想做的事情,即做出决定,做数学等等......或者(在我的情况下)把它写出去看。