【问题标题】:Read the last line of a CSV file and extract one value读取 CSV 文件的最后一行并提取一个值
【发布时间】:2013-03-06 19:29:14
【问题描述】:

Node.js 新手,尝试从 CSV 文件的最后一行提取值。这是 CSV:

Unit ID,Date,Time,Audio File
Log File Created,3/6/2013,11:18:25 AM,file:\\\C:\Users\Ben\Documents\1_03-06-2013_1114-50.mp3
1,3/6/2013,11:20:24 AM,file:\\\C:\AlertLog\1_03-06-2013_1120-24.mp3
1,3/6/2013,11:20:39 AM,file:\\\C:\AlertLog\1_03-06-2013_1120-24.mp3

我想要获取的部分是 file:\\\C:\AlertLog\1_03-06-2013_1120-24.mp3 - 最好去掉 file:\\\ 部分。

抱歉,我没有任何代码可显示,我只有几个小时的 Node.js 经验,似乎找不到任何关于如何完成此类事情的文档。任何帮助,将不胜感激。谢谢!

【问题讨论】:

    标签: node.js csv


    【解决方案1】:

    常规文件

    像普通文件一样读取文件,将文件内容分成几行,取最后一行,用逗号分隔,取最后一部分。

    var fs = require('fs'); // file system module
    
    fs.readFile('/path/to/file.csv', 'utf-8', function(err, data) {
        if (err) throw err;
    
        var lines = data.trim().split('\n');
        var lastLine = lines.slice(-1)[0];
    
        var fields = lastLine.split(',');
        var audioFile = fields.slice(-1)[0].replace('file:\\\\', '');
    
        console.log(audioFile);
    });
    

    File System module documentation

    CSV 解析器

    您也可以使用node-csv-parser 模块。

    var fs = require('fs');
    var csv = require('csv');
    
    csv()
     .from.stream(fs.createReadStream('/path/to/file.csv'))
     .to.array(function(data, count) {
        var lastLine = data.slice(-1)[0];
        var audioFile = lastLine.slice(-1)[0].replace('file:\\\\', '');
        console.log(audioFile);
      });
    

    【讨论】:

    • 谢谢!不幸的是,这只是给了我“3”,我发现它是 .mp3 结尾的 3。替换抛出错误`Object 3 has no method 'replace'
    • data.slice(-1) 更改为lines.slice(-1)
    • 好的,现在我们到了某个地方!如果我删除了 .replace,CSV 解析器方法会输出最后一行 - 仍然会抛出该错误。但这是整条线,而不仅仅是最后一部分..
    • lines 未在函数中定义,因此会引发错误。将function(data, count) 更改为function(lines, count),然后将data.slice(-1) 更改为lines.slice(-1) 没有多大意义,因为它在做同样的事情?
    • 在第一个代码示例中将data.slice(-1) 更改为lines.slice(-1)
    【解决方案2】:

    我通过向后读取文件直到最后一行被读取来做到这一点:

    var fs = require('fs');
    var path = require('path');
    var fileName = path.join(__dirname, 'test.txt');
    var readLastLine = function(name, callback) {
        fs.stat(name, function(err, stat) {
            fs.open(name, 'r', function(err, fd) {
                if(err) throw err;
                var i = 0;
                var line = '';
                var readPrevious = function(buf) {
                    fs.read(fd, buf, 0, buf.length, stat.size-buf.length-i, function(err, bytesRead, buffer) {
                        if(err) throw err;
                        line = String.fromCharCode(buffer[0]) + line;
                        if (buffer[0] === 0x0a) { //0x0a == '\n'
                            callback(line);
                        } else {
                            i++;
                            readPrevious(new Buffer(1));
                        }
                    });
                }
                readPrevious(new Buffer(1));
            });
        });
    }
    readLastLine(fileName, function(line) {
        console.log(line);
    });
    

    【讨论】:

    • 非常好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多