这个问题与已经有答案的链接不同。特别是这段代码改编自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放在回调中,我会在读取的每次迭代中记录信息。我只想在文件完成时处理数据。
我在EOF
或fs
的节点文档中找不到readline
或类似的标记。
此外,如果有更简单的方法来获取我输入JSON格式的数据,我很乐意听到。提前致谢。
答案 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"))