Reputation: 9230
New to Node.js and trying to pull a value from the very last line of a CSV file. Here is the 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
The part I am trying to grab is file:\\\C:\AlertLog\1_03-06-2013_1120-24.mp3
- preferably getting rid of the file:\\\
part.
Sorry that I do not have any code to show, just have a few hours of experience with Node.js and cannot seem to find any docs on how to accomplish something like this. Any help would be appreciated. Thanks!
Upvotes: 5
Views: 13432
Reputation: 631
I did it by reading the file backwards until the last line was read:
Update 2022 (use modern javascript and read buffer only once)
import { open } from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'url';
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const fileName = path.join(__dirname, 'test.txt');
async function readLastLine(name) {
var line = '';
var chunkSize = 200 // how many characters to read from the end of file
const fd = await open(name);
const st = await fd.stat();
const buf = Buffer.alloc(chunkSize);
const len = buf.length;
const { bytesRead, buffer } = await fd.read(buf, 0, len, st.size - len)
for (let i = len - 1; i > -1; i--) {
const isEol = buffer[i] === 0x0a // 0x0a == '\n'
const isCtrl = buffer[i] < 0x20 // 0-31 are ASCII control characters
if (isEol && line.length > 0) {
break;
} else if (!isCtrl && !isEol) {
line = String.fromCharCode(buffer[i]) + line;
}
}
fd.close();
return line;
}
try {
const line = await readLastLine(fileName)
console.log(line);
} catch (err) {
console.error(err);
}
Old 2014 answer
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);
});
Upvotes: 9
Reputation: 13405
Read the file like a regular file, split the file contents into lines, take the last line, split by a comma and take the last part.
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
You can also use the node-csv-parser module.
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);
});
Upvotes: 9