访问由readline和&amp ;;解析的数据。在回调函数之外的node.js中的fs

时间:2017-01-10 05:56:10

标签: javascript json node.js readfile fs

这个问题与已经有答案的链接不同。特别是这段代码改编自node.js文档,关于fs和readfile的使用以及查找文件结束标志,我学到的是readfile.close方法。谢谢你的回答。

我在本地编写了一个小实用程序,尝试将key:value对的文本文件转换为空白行,将程序分隔为JSON文件以在React项目中使用。

我直接从node.js文档中获得了readline函数的基础。我在我的mac上使用节点6.9.0

这是完整的脚本:

const readline = require('readline');
const fs = require('fs');

const rl = readline.createInterface({
  input: fs.createReadStream('usat-ncaa-programs.txt')
});

var newPairs=["test"];
rl.on('line',
  function (line) {
  if (line===null){
    newPairs.push("}], [ {")
  } else if (line) {
    var keyValue = line.match(/^(.*):(.*)/)
    var newKeyValuePair =  "'" + keyValue[1].trim() + "':  '" + keyValue[2].trim() + "'"
    newPairs.push(newKeyValuePair)
    //console.log (newKeyValuePair)
  }

})

console.log(newPairs)

输入文件看起来像这样(大约有12个程序),我只包括2 1/2,所以你可以看到格式:

University: Arizona State University
Division: I
University Home Page: http://www.asu.edu/
Recruiting Link: https://questionnaire.acsathletics.com/Questionnaire/Questionnaire.aspx?&SPSID=1061112&SPID=177408&DB_LANG=C&DB_OEM_ID=30300&q=2015&s=159130&o=143
Team Homepage: http://www.thesundevils.com/index.aspx?path=triathlon
Head Coach: Cliff English
w: 480.965.0546
e: cliff.endlish@asu.edu
bg-color: #990033
color: #FFB310

University: Belmont Abby College
Division: II
University Home Page: http://belmontabbeycollege.edu/
Recruiting Link: https://coach.scoutforce.com/p/414f3219dd
Team Homepage: http://abbeyathletics.com/sports/wtri/index
Head Coach: Nick Radkewich
w: 704.461.5010
e: NicholasRadewich@bac.edu
Twitter: https://twitter.com/AbbeyTri
bg-color: #FFFDD0
color: #DC143C

University:Black Hills State University 
Division: II
University Home Page: http://www.bhsu.edu/
...

我的问题是,虽然我可以逐行读取文本文件并解析一些看起来像JSON文件的信息,但我无法在回调函数之外访问该数据。

我不知道如何将这些数据保存到新文件中,或者甚至只是将对象输出到我的控制台以进行剪切和放大。粘贴并手动编辑。

在上面的脚本中,变量newPairs的记录输出是[" test"],而不是我试图完成的逐行解析。

如果我将console.log放在回调中,我会在读取的每次迭代中记录信息。我只想在文件完成时处理数据。

我在EOFfs的节点文档中找不到readline或类似的标记。

此外,如果有更简单的方法来获取我输入JSON格式的数据,我很乐意听到。提前致谢。

2 个答案:

答案 0 :(得分:1)

您必须了解回调函数是异步执行的。这意味着console.log(newPairs)会在回调之前执行,因此只会导致" test"。

您应该听取Readline的close event,如下所示:

rl.on('close', function() {
  console.log(newPairs);
});

正如文件所述:

  

'关闭'发生以下任一情况时会发出事件:

     
      
  • 调用rl.close()方法和readline.Interface实例   放弃了对输入和输出流的控制;
  •   
  • 输入流接收其结尾'事件;输入流接收-D信号传输结束(EOT);
  •   
  • 输入流接收-C以发信号SIGINT,并且在readline.Interface实例上没有注册SIGINT事件侦听器。
  •   
  • 调用侦听器函数时不传递任何参数。
  •   
     

readline.Interface实例应被视为"已完成"   一旦关闭'事件被发出。

所以这就是'EOF'你正在寻找: - )

答案 1 :(得分:0)

我知道这是一个老问题,但是答案并没有帮助我。您可以使用这样的约定:

CASE_MAPPING_ONE_SIDED = { "a": "A",
    "b": "B",
    "c": "C",
    "d": "D",
    "e": "E",
    "f": "F",
    "g": "G",
    "h": "H",
    "i": "I",
    "j": "J",
    "k": "K",
    "l": "L",
    "m": "M",
    "n": "N",
    "o": "O",
    "p": "P",
    "q": "Q",
    "r": "R",
    "s": "S",
    "t": "T",
    "u": "U",
    "v": "V",
    "w": "W", }
CASE_MAPPING = {}
# Map all lower-case characters to upper-case and also save it in the dictionary
for lower_ch in CASE_MAPPING_ONE_SIDED:
    upper_ch = CASE_MAPPING_ONE_SIDED[lower_ch]
    CASE_MAPPING[lower_ch] = upper_ch
    CASE_MAPPING[upper_ch] = lower_ch
def alternative_versions(s):
    res = [s]
    i = 0
    while i < len(s):
        alt = s[:i]
        # Replace the ith character with an alternative version
        alt += CASE_MAPPING[s[i]]
        alt += s[i+1:]
        res.append(alt)
        i += 1
    return res
print(alternative_versions("Hello"))