Javascript Node.js-读取CSV文件时不使用行号>;500
我目前正在努力运行Node.js服务器 我想做的是:Javascript Node.js-读取CSV文件时不使用行号>;500,javascript,node.js,csv,Javascript,Node.js,Csv,我目前正在努力运行Node.js服务器 我想做的是: 将CSV文件从移动设备上载到我的本地服务器,并将其保存在文件系统中 读取.csv文件的每一行,并将每一行保存到我的MongoDB数据库中 上传和保存文件的工作完美无瑕。读取.csv文件并将每行保存到数据库仅适用于行号较小的文件。 我不知道它停止工作时的确切行数。每次我读一个文件,它似乎都不一样。 有时(如果行号大于1000),我使用的CSV阅读器甚至没有开始处理文件。其他时候,他只读100-200行,然后停下来 以下是我上传文件的代码:
- 将CSV文件从移动设备上载到我的本地服务器,并将其保存在文件系统中
- 读取.csv文件的每一行,并将每一行保存到我的MongoDB数据库中
var fs = require('fs');
var sys = require("sys");
var url = require('url');
var http = require('http');
http.createServer(function(request, response) {
sys.puts("Got new file to upload!");
var urlString = url.parse(request.url).pathname;
var pathParts = urlString.split("/");
var deviceID = pathParts[1];
var fileName = pathParts[2];
sys.puts("DeviceID: " + deviceID);
sys.puts("Filename: " + fileName);
sys.puts("Start saving file");
var tempFile = fs.createWriteStream(fileName);
request.pipe(tempFile);
sys.puts("File saved");
// Starting a new child process which reads the file
// and inserts each row to the database
var task = require('child_process').fork('databaseInsert.js');
task.on('message', function(childResponse) {
sys.puts('Finished child process!');
});
task.send({
start : true,
deviceID : deviceID,
fileName : fileName
});
sys.puts("After task");
response.writeHead(200, {
"Content-Type" : "text/plain"
});
response.end('MESSAGE');
}).listen(8080);
这一切都很好。
现在,子进程的代码(databaseInsert.js):
起初我没有使用子进程,但我的行为和现在一样。所以我测试了这个
希望对Node.js有一定经验的人能帮助我。我没有足够的代表将此作为评论发布(所以不要否决我:) 但是你熟悉吗 我过去用它从我的数据库导出到csv文件…所以你可以在从移动客户端上传到服务器后做相反的事情
它来自shell,但是您可以使用用代码编写它。我认为您的问题是,您正在试图读取仍在写入的
tempFile
。现在,您正在将请求管道化到文件流(并行和异步进行),并启动读取器进程。然后,读取器进程将开始与写入操作并行地读取文件。如果读卡器速度更快(通常会更快),它将读取前几条记录,但随后会遇到文件结束并停止读取
为了解决这个问题,您只能在编写完成后启动读卡器进程,即从sys.puts(“File.send”)放置部件
前进到tempFile.end(…)
的回调中(请参阅)
在我的理解中,在文件仍在写入时读取它(类似于Unix中的
tail
命令),是相当困难的(有关实现正确的tail有多困难的详细信息,请通过谷歌搜索)。您是否尝试过通过删除程序的某些部分进行调试,并了解其工作原理?i、 e.可能需要删除写入MongoDB部分,看看这是否适用于所有文件。我刚刚删除了将行插入数据库的代码部分。结果是一样的。当时你的csv阅读器有点问题。你完全正确!我已经按照你的建议修好了。谢谢你的意见。我选择了更简单的方法,并根据Miichi的答案进行了修复。
var sys = require("sys");
var yaCSV = require('ya-csv');
var Db = require('mongodb').Db;
var dbServer = require('mongodb').Server;
process.on('message', function(info) {
sys.puts("Doing work in child process");
var fileName = info.fileName;
var deviceID = info.deviceID;
sys.puts("Starting db insert!");
var dbClient = new Db('test', new dbServer("127.0.0.1", 27017, {}), {
w : 1
});
dbClient.open(function(err, client) {
if (err) {
sys.puts(err);
}
dbClient.createCollection(deviceID, function(err, collection) {
if (err) {
sys.puts("Error creating collection: " + err);
} else {
sys.puts("Created collection: " + deviceID);
var csvReader = yaCSV.createCsvFileReader(fileName, {
columnsFromHeader : true,
'separator' : ';'
});
csvReader.setColumnNames([ 'LineCounter', 'Time', 'Activity',
'Latitude', 'Longitude' ]);
var lines = 0;
csvReader.addListener('data', function(data) {
lines++;
sys.puts("Line: " + data.LineCounter);
var docRecord = {
fileName : fileName,
lineCounter : data.LineCounter,
time : data.Time,
activity : data.Activity,
latitude : data.Latitude,
longitude : data.Longitude
};
collection.insert(docRecord, {
safe : true
}, function(err, res) {
if (err) {
sys.puts(err);
}
});
});
}
});
});
process.send('finished');
});