86

I have a sample array as follows

var arr = [ [ 1373628934214, 3 ],
  [ 1373628934218, 3 ],
  [ 1373628934220, 1 ],
  [ 1373628934230, 1 ],
  [ 1373628934234, 0 ],
  [ 1373628934237, -1 ],
  [ 1373628934242, 0 ],
  [ 1373628934246, -1 ],
  [ 1373628934251, 0 ],
  [ 1373628934266, 11 ] ]

I would like to write this array to a file such as I get a file as follows

1373628934214, 3 
1373628934218, 3
1373628934220, 1
......
......
dopplesoldner
  • 8,891
  • 12
  • 44
  • 55

7 Answers7

136

If it's a huuge array and it would take too much memory to serialize it to a string before writing, you can use streams:

var fs = require('fs');

var file = fs.createWriteStream('array.txt');
file.on('error', function(err) { /* error handling */ });
arr.forEach(function(v) { file.write(v.join(', ') + '\n'); });
file.end();
mak
  • 13,267
  • 5
  • 41
  • 47
  • 3
    Why not put `file.end();` after the loop instead of testing the index? –  Jul 12 '13 at 12:22
  • Thanks! My arrays are in the order of 1000+ so this method works perfectly – dopplesoldner Jul 12 '13 at 14:24
  • 18
    odd, this is giving me error: `TypeError: v.join is not a function`, to troubleshoot, i logged `typeof(v)` within the loop and it is a string, [coderade's solution](https://stackoverflow.com/a/51362713) doesn't seem to produce error though. – user1063287 Jul 30 '19 at 10:10
  • 2
    @user1063287 Double check that you're passing a multi-dimensional array (as in the OP) – Jose A Sep 11 '20 at 17:14
53

Remember you can access good old ECMAScript APIs, in this case, JSON.stringify().

For simple arrays like the one in your example:

require('fs').writeFile(

    './my.json',

    JSON.stringify(myArray),

    function (err) {
        if (err) {
            console.error('Crap happens');
        }
    }
);
Jairo
  • 863
  • 7
  • 14
30

To do what you want, using the fs.createWriteStream(path[, options]) function in a ES6 way:

const fs = require('fs');
const writeStream = fs.createWriteStream('file.txt');
const pathName = writeStream.path;
 
let array = ['1','2','3','4','5','6','7'];
  
// write each value of the array on the file breaking line
array.forEach(value => writeStream.write(`${value}\n`));

// the finish event is emitted when all data has been flushed from the stream
writeStream.on('finish', () => {
   console.log(`wrote all the array data to file ${pathName}`);
});

// handle the errors on the write process
writeStream.on('error', (err) => {
    console.error(`There is an error writing the file ${pathName} => ${err}`)
});

// close the stream
writeStream.end();
valdeci
  • 13,962
  • 6
  • 55
  • 80
18

A simple solution is to use writeFile :

require("fs").writeFile(
     somepath,
     arr.map(function(v){ return v.join(', ') }).join('\n'),
     function (err) { console.log(err ? 'Error :'+err : 'ok') }
);
Denys Séguret
  • 372,613
  • 87
  • 782
  • 758
4
async function x(){
var arr = [ [ 1373628934214, 3 ],
[ 1373628934218, 3 ],
[ 1373628934220, 1 ],
[ 1373628934230, 1 ],
[ 1373628934234, 0 ],
[ 1373628934237, -1 ],
[ 1373628934242, 0 ],
[ 1373628934246, -1 ],
[ 1373628934251, 0 ],
[ 1373628934266, 11 ] ];
await fs.writeFileSync('./PATH/TO/FILE.txt', arr.join('\n'));
}
3

We can simply write the array data to the filesystem but this will raise one error in which ',' will be appended to the end of the file. To handle this below code can be used:

var fs = require('fs');

var file = fs.createWriteStream('hello.txt');
file.on('error', function(err) { Console.log(err) });
data.forEach(value => file.write(`${value}\r\n`));
file.end();

\r\n

is used for the new Line.

\n

won't help. Please refer this

KamalDeep
  • 791
  • 5
  • 8
2

Try with this

await fs.writeFileSync('arreglo.txt', arreglo.join('\n '));

This code works for me

Roman Mahotskyi
  • 4,576
  • 5
  • 35
  • 68
Roel Leal
  • 49
  • 2
  • Works great. Although the extra space isn't needed for the `.join('\n ')`, it adds a space at the beginning of each line starting at line 2. – synkro May 21 '22 at 19:13
  • Yeah, i added this space to separate data but this doesn't work for me hahaha, just add a space, I'm glad it works for you – Roel Leal May 22 '22 at 01:28