Я работаю в Node.JS, и мы открываем поток чтения из CSV, загружаем эти данные в чанки, обрабатываем каждую строку этих чанков с помощью регулярных выражений и сравниваем их с другим файлом данных, а затем передаем их в поток записи для записи в новый файл
Проблема в том, что второй поток чтения (называемый бета) для файла сравнения занимает больше времени, чем первый поток чтения (называемый альфа) в некоторых случаях, и это приводит к тому, что не все данные сравнения готовы к go и доступны для чтения, что приводит к нулевым значениям Я не уверен, как мне удастся заставить альфу удерживать выполнение и не запускаться до тех пор, пока бета не вызовет readStream.on (end), как мне кажется, go об этом, потому что во всех моих попытках с обещаниями и ожиданием зацикливается, либо полностью замораживает программу, либо совсем не ждет, пока бета-версия завершит работу sh, и завершает выполнение до того, как ее завершат. Единственное решение, которое я нашел, - это поместить бета-версию непосредственно в основной код и поместить альфа-код жестко закодированным в функцию бета readStream.on (end), однако из-за того, что бета-версия будет работать на основе данных, которые мы используем , это означает, что мне придется иметь несколько повторений альфа в каждом экземпляре беты в основном коде, заблокированном в операторах switch или if, и мне это совсем не нравится
Это было огромной проблемой для несколько дней, и я в конце моей веревки об этом. Ничего не сработало
Отметим, что на вспомогательный скрипт для запуска беты ссылается оператор require, а переменные и скрипты возвращаются ему с помощью module.exports. Я попытался поместить весь бета-поток в функцию в module.exports и дождаться возврата true, либо изменить значение, либо вызвать альфа из этой функции, передав во вторичный скрипт и вернув его, однако он все еще никогда не ждет, пока бета завершится sh, прежде чем она взлетит, и делает свое дело
Прошу прощения за длинный текст
Это бета-файловый поток, как в настоящее время реализованы. Я бы предпочел, чтобы он содержался в postValid. js, так как именно здесь используются данные из этого файлового потока, и будет несколько перестановок postValid на основе данных
postValid = require("./postValid.js");
postValid.country = country;
fs.createReadStream(postValid.country + " ADDRESS REF DATA.csv")
.pipe(csv({e: null, headers: false, separator: '\t'}))
//Indicate start of reading
.on('resume', (data) => console.log("Reading complete postal code file..."))
//Pass data to be buffered and chunked to the processing script
.on('data', (data) => {
//Each line of data gets processed as needed and stored here
})
.on('end', () => {
postValid.complete = true;
console.log("Done reading");
ThisFunc();
});
Это альфа-файл потока как сейчас. Это в файле, который я хочу, но я должен заблокировать его внутри функции, чтобы работать с этим, и я бы предпочел, чтобы он был первым, кто запустит будущие возможные наборы данных
function ThisFunc() {
//Do a quick parse of the csv to get a row count
fs.createReadStream(fileName)
.pipe(csv())
.on('resume', () => {
console.log("Getting file length...");
postValid.complete = false;
})
.on('data', () => initLen++)
.on('end', () => {
console.log("The csv is " + initLen + " lines long, beginning processing")
//Length of 1/100 of the file size, needs to be modular to file length rounded up
chunkLen = Math.round(initLen/100);
//Read the CVS filestream
fs.createReadStream(fileName)
.pipe(csv())
//Indicate start of reading
.on('resume', () => {
console.log("Loading...");
})
//Pass data to be buffered and chunked to the processing script
.on('data', (data) => {
//Lines of data get passed into the processing script here
})
//End of reading
.on('end', () => {
//Read the final chunk of lines that don't fit and process them
console.log("100%");
//Print results
console.log("File Length: " + results.length);
console.log("Processed: " + finalAdd.length);
console.log("Found Code: " + postCodes);
});
});
}
Я удалил немного кода чтобы это было законно, в нем должны быть все важные биты. Файлы могут быть чем-то между несколькими миллионами строк или несколькими тысячами