【问题标题】:JavaScript to split string by end of line character and read each lineJavaScript 按行尾字符拆分字符串并读取每一行
【发布时间】:2013-11-04 03:12:53
【问题描述】:

我需要遍历一个包含几个 eol 字符的大字符串,并读取这些行中的每一行以查找字符。我本可以执行以下操作,但我觉得效率不高,因为这个大字符串中可能有超过 5000 个字符。

var str = largeString.split("\n");

然后将str作为数组循环

我不会真正使用 jquery,只能使用简单的 JavaScript。

还有其他有效的方法吗?

【问题讨论】:

  • hmmm...你可以使用网络工作者,你可以在后台解析字符串。 w3schools.com/html/html5_webworkers.asp
  • 使用正则表达式怎么样?
  • 这应该可以正常工作 - 没有明显的方法可以让它更简单。 5000 个字符对于现代计算机甚至智能手机来说都不算什么。你有证据表明这太慢了吗?
  • 5000 只是我期望的最小数字。但它很可能是 100000 个字符。我意识到没有其他有效的方法可以实现这一目标。例如在 java 中有 StringReader 用于此目的。

标签: javascript string split eol


【解决方案1】:

您总是可以使用indexOfsubstring 来获取字符串的每一行。

var input = 'Your large string with multiple new lines...';
var char = '\n';
var i = j = 0;

while ((j = input.indexOf(char, i)) !== -1) {
  console.log(input.substring(i, j));
  i = j + 1;
}

console.log(input.substring(i));

编辑在回答之前我没有看到这个问题这么老。 #失败

编辑 2 修复了在最后一个换行符之后输出最后一行文本的代码 - 感谢 @Blaskovicz

【讨论】:

  • 作为一个在 2017 年有同样问题的人,我很高兴你发布了这个答案,尽管问题很老,这是迄今为止最好的一个
  • 另外,对于阅读本文的人,请记住,如果它们没有结束分隔符,则不会像 input.split(char) 这样得到尾随字符。如果你需要这样做,你可以检查 input.length === i 是否(意味着没有尾随字符)。
【解决方案2】:

对于现代 JavaScript 引擎来说,5000 似乎并没有那么激烈。当然,这也取决于您在每次迭代中所做的事情。为清楚起见,我建议使用eol.split[].forEach

eol is an npm package。在 Node.js 和 CommonJS 中,您可以使用 npm install eolrequire 它。在 ES6 捆绑器中,您可以import。否则通过<script> 加载 eol 是全局的

// Require if using Node.js or CommonJS
const eol = require("eol")

// Split text into lines and iterate over each line like this
let lines = eol.split(text)
lines.forEach(function(line) {
  // ...
})

【讨论】:

  • 第一行产生异常:Uncaught ReferenceError: require is not defined
  • 也 split 与示例完全相反。正确的版本是:string.split(symbolForSplitting)
  • @LeonidMednikov 答案已澄清。 require 用于 Node.js 或 CommonJS。否则跳过该行。 eol.split 是与"".split 不同的库方法。下次请考虑在不理解的情况下投票之前提出问题:)
【解决方案3】:

如果您使用的是 NodeJS,并且有一个大字符串要逐行处理:

const Readable = require('stream').Readable
const readline = require('readline')

promiseToProcess(aLongStringWithNewlines) {
    //Create a stream from the input string
    let aStream = new Readable();
    aStream.push(aLongStringWithNewlines);
    aStream.push(null);  //This tells the reader of the stream, you have reached the end

    //Now read from the stream, line by line
    let readlineStream = readline.createInterface({
      input: aStream,
      crlfDelay: Infinity
    });

    readlineStream.on('line', (input) => {
      //Each line will be called-back here, do what you want with it...
      //Like parse it, grep it, store it in a DB, etc
    });

    let promise = new Promise((resolve, reject) => {
      readlineStream.on('close', () => {
        //When all lines of the string/stream are processed, this will be called
        resolve("All lines processed");
      });
    });

    //Give the caller a chance to process the results when they are ready
    return promise;
  }

【讨论】:

    【解决方案4】:

    您可以手动逐个字符地读取它,并在收到换行符时调用处理程序。在 CPU 使用方面不太可能更有效,但可能会占用更少的内存。但是,只要字符串小于几 MB,就没有关系。

    【讨论】:

      【解决方案5】:
      function findChar(str, char) {
          for (let i = 0; i < str.length; i++) {
              if (str.charAt(i) == char) {
                  return i
              }
          }
          return -1
      }
      

      【讨论】:

        【解决方案6】:

        所以,你知道怎么做,你只是确保没有更好的方法吗?好吧,我不得不说你提到的方式就是这样。虽然如果您正在寻找由某些字符分割的某些文本,您可能想要查找正则表达式匹配。可以找到一个 JS 正则表达式参考 Here

        如果您知道如何设置文本,这将很有用,类似于

        var large_str = "[important text here] somethign something something something [more important text]"
        var matches = large_str.match(\[([a-zA-Z\s]+)\])
        for(var i = 0;i<matches.length;i++){
           var match = matches[i];
           //Do something with the text
        }
        

        否则,是的,带有循环的 large_str.split('\n') 方法可能是最好的。

        【讨论】:

        • 正则表达式不太可能比.split() 快。另外,我认为这不会起作用,因为\s 包含\n 不会打破行边界。
        • 考虑到我不知道他会怎么找,我给了他我能做的。如果我知道更多,我可以提供更多帮助。我想他可以.split() 一些东西,然后对每个字符串使用一个正则表达式来找到他想要的任何东西。
        猜你喜欢
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        • 2018-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多