Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js-读取CSV文件时不使用行号>;500_Javascript_Node.js_Csv - Fatal编程技术网

Javascript Node.js-读取CSV文件时不使用行号>;500

Javascript Node.js-读取CSV文件时不使用行号>;500,javascript,node.js,csv,Javascript,Node.js,Csv,我目前正在努力运行Node.js服务器 我想做的是: 将CSV文件从移动设备上载到我的本地服务器,并将其保存在文件系统中 读取.csv文件的每一行,并将每一行保存到我的MongoDB数据库中 上传和保存文件的工作完美无瑕。读取.csv文件并将每行保存到数据库仅适用于行号较小的文件。 我不知道它停止工作时的确切行数。每次我读一个文件,它似乎都不一样。 有时(如果行号大于1000),我使用的CSV阅读器甚至没有开始处理文件。其他时候,他只读100-200行,然后停下来 以下是我上传文件的代码:

我目前正在努力运行Node.js服务器

我想做的是:

  • 将CSV文件从移动设备上载到我的本地服务器,并将其保存在文件系统中
  • 读取.csv文件的每一行,并将每一行保存到我的MongoDB数据库中
上传和保存文件的工作完美无瑕。读取.csv文件并将每行保存到数据库仅适用于行号较小的文件。 我不知道它停止工作时的确切行数。每次我读一个文件,它似乎都不一样。 有时(如果行号大于1000),我使用的CSV阅读器甚至没有开始处理文件。其他时候,他只读100-200行,然后停下来

以下是我上传文件的代码:

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');
});