【问题标题】:Javascript read external text file, pass text file data as parameterJavascript读取外部文本文件,将文本文件数据作为参数传递
【发布时间】:2016-09-19 03:29:15
【问题描述】:

请检查这个小提琴:https://jsfiddle.net/dp0y4hrw/16/

这是 JS 在字符串数组中查找最长的复合词。

我希望这个程序读取一个本地 txt 文件,而不是一个数组,该文件包含超过 100,000 行文本。然后找出最长的复合词。每行一个单词。

我尝试使用 FileReader 来获取数据。我能够正确传递数据,但在“addPrefix”和“findPrefixes”之间的一些共享变量方面给我带来了麻烦。

我还尝试使用 promise 来解释异步行为:

function readFile(event) {  
  var file = event.target.files[0]; 

  if (file) {   
    new Promise(function(resolve, reject) {      
      var reader = new FileReader();      
      reader.onload = function (evt) {      
      resolve(evt.target.result);      
      };     

      reader.readAsText(file);     
      reader.onerror = reject;   
     })    

     .then(findLongestWord)   
     .catch(function(err) {     
       console.log(err)
     });  
   }
 }

document.getElementById('file').addEventListener('change', readFile, false);

function findLongestWord(data) {
...

这仍然给我一个问题。在这种情况下,读取文件以便我可以正确处理内容的最佳方法是什么?

编辑:

// adds word as a prefix
var addPrefix = function (word) {
  var i  = 0;
  var current = prefixes;
  var char;

  while (char = word[i++]) {
    if (!current[char]) {
      current[char] = {};
    }
      current = current[char];      
  }
  current.word = true;
  return current.word; //RETURNING CURRENT WORD HERE
};

// Finds the longest prefix we can make using the word.
var findPrefixes = function (word) {
  var prefix = '';
  var current = prefixes;
  var found  = [];
  var i  = 0;
  var char;

  while (char = word[i++]) {
    if (!current[char]) { 
      break; 
    }
    // Move to the next character and add to the prefix.
    current = current[char];
    prefix += char;

    if(current.word)
    {
      found.push(prefix);
    }
  }
  return found;
};

//for each word in list, add to prefix
list.forEach(function (word) {
  var prefix;

// If we can find a closest possible word, it may be possible to create a
// compound word - but we won't be able to check until we reach the end.
if ((prefix = findPrefixes(addPrefix())) && prefix.length) { //FINDPREFIXES USING ADDPREFIX HERE
  prefixMatch.push([ word, prefix ]);

}

// Insert the word into the prefix tree.
addPrefix(word);
});

编辑 2:这是输入文本文件的示例:

cat
cats
catsdogcats
dog
dogcatsdog
hippopotamuses
rat
ratcatdogcat
catratdograt
dogcatscats

预期结果是:最长:ratcatdogcat,catratdograt...第二长:catsdogcats,dogcatscats...复合词数:5

【问题讨论】:

  • 您在 Question 和链接的 jsfiddle 处使用 javascript 有什么问题?
  • @guest271314 问题是我希望能够通过readFile(event) 读取外部文本文件数据,但是当我这样实现时,'current.word' object.key 不会在@ 之间共享987654327@ 和findPrefixes。所以功能不起作用。
  • " 'current.word' object.key 没有在 addPrefix 和 findPrefixes 之间共享" 应该首先调用哪个函数?应该调用的第一个函数的预期结果值和传递给第二个函数的预期参数是什么?第二个函数的预期返回值是多少?
  • @guest271314 先调用 findPrefix,然后调用 addPrefix。目前是如何设置的,说“字”是通过的。该函数将对象堆叠在其他对象中,并且只有最后一个具有“单词”属性。例如:如果您的文本文件中只有“word”,您的 current 变量将是这样的:'{"w":{"o":{"r":{"d":{"word":真的}}}}}' 。这意味着current.word 只会在单词末尾为真。这样我们就可以将 'word' 推送到 found 数组中。
  • @guest271314 怎么样。我说不出话来。我非常感谢你。我怎样才能给你更多的不仅仅是 +1 声望?谢谢你陪我一个多小时。有用。不知道正则表达式在这里做什么,哈哈

标签: javascript


【解决方案1】:

使用RegExp/\w+/g

\w 匹配基本拉丁字母表中的任何字母数字字符, 包括下划线。

x+ 匹配前一项 x 1 次或多次

var list = data.match(/\w+/g);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-06
    • 2015-12-23
    相关资源
    最近更新 更多