2017-01-10 9 views
1

Этот вопрос отличается от того, который связан с уже имеющим ответ. Именно этот фрагмент кода адаптирован из документации node.js относительно использования fs и readfile и ищет конец флага файла, который я узнал, это метод readfile.close. Спасибо за ответ.Доступ к данным, проанализированным readline & fs в node.js вне функции обратного вызова

Я написал небольшую утилиту локально, чтобы попытаться преобразовать текстовый файл из key:value пар с пустой строкой, разделяющей программы в файл JSON для использования в проекте React.

Я получил основу функции readline непосредственно из документации node.js. Я использую узел 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: [email protected] 
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: [email protected] 
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

Вы должны прочитать [Почему моя переменная неизмененном после того как я изменить его внутри функции? - Ссылка на асинхронный код] (http://stackoverflow.com/questions/23667086/why-is-my-variable-unaltered-after-i-modify-it-inside-of-a-function-asynchron) –

+0

спасибо, что я сделал взглянуть. Я знал, что это связано с тем, что он асинхронен, но не был испытан с методами readfile. Еще раз спасибо, я ценю вашу помощь. – Shazam

+0

Я могу только рекомендовать всегда взглянуть на полную документацию. В этом случае: https://nodejs.org/api/readline.html#readline_event_close. Вероятно, вы также хотите прочитать немного больше о потоках: https://github.com/substack/stream-handbook –

ответ

1

Вы должны понимать, что функция callback выполняется асинхронно. Это означает, что console.log(newPairs) выполняется до вашего обратного вызова, поэтому это приводит только к «тесту».

Вы должны слушать Readline-х close event, например, так:

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

В документации состояний:

'закрыть' событие генерируется, когда один из следующих случаев:

  • Вызывается метод rl.close() и строка readline.Экземпляр интерфейса отказался от управления входными и выходными потоками;
  • Входной поток принимает свое событие «конец»; Входной поток принимает -D к сигналу окончания передачи (EOT);
  • Входной поток принимает сигнал -C для сигнала SIGINT и нет прослушивателя событий SIGINT, зарегистрированного на экземпляре readline.Interface.
  • Функция прослушивателя вызывается без передачи каких-либо аргументов.

Экземпляр readline.Interface следует считать «законченным» после того, как выйдет событие «закрыть».

Так это будет «EOF» вы ищете :-)

+0

Я знаю, что это асинхронно, но я не знал, как с ним работать, чтобы прочитать полный файл. Я попробую закрыть мероприятие и посмотреть, делает ли это трюк. Я искал метод «конца файла». Это сработало, и я отметил это как ответ. Спасибо за помощь. – Shazam

+0

Я обновил ответ с выдержкой из doco – sgtdck

+0

, но он еще не даст мне принять ответ, и я отправился в постель для нового старта ... будет принимать как ответ утром. Еще раз спасибо. – Shazam