ãã®è¨äºã«æ¸ãã¦ãããã¨
ã¿ã¤ãã«ã®éããNode.jsã§csv-parseã使ã£ã¦csvãã¡ã¤ã«ãèªã¿è¾¼ãå®è£ ãç´¹ä»ãã¾ãã Node.jsã«ã¯csvãã¡ã¤ã«ãèªã¿è¾¼ãã©ã¤ãã©ãªãè¤æ°ããã¾ãããããããä¸çªäººæ°ã£ã½ãcsv-parseã使ã£ã¦ã¿ã¾ããã
csv vs csv-parse vs csv-parser vs fast-csv | npm trends
ã¡ããã¨TypeScriptã«ã対å¿ãã¦ãã¾ãã
ãã®è¨äºã§ã®å®è£ ã®å ¨ä½ã¯GitHubã«ç½®ãã¾ããã ãããã°åç §ãã¦ãã ããã
å®è£
使ããããª3ã¤ã®å®è£ ãç´¹ä»ãã¾ãã
- 䏿¬ã§csvãã¡ã¤ã«ãèªã¿è¾¼ã
- 1è¡ãã¤csvãã¡ã¤ã«ãèªã¿è¾¼ã
- S-JISã空è¡ãããåºåãæåã®ãã¨ï¼å¤ã®å·¦å´ï¼ã«ç©ºç½ããã®csvãã¡ã¤ã«ãèªã¿è¾¼ãï¼iconv-liteãå©ç¨ãã¾ãï¼
䏿¬ã§csvãã¡ã¤ã«ãèªã¿è¾¼ã
ããã§èªã¿è¾¼ãcsvãã¡ã¤ã«ã¯ä»¥ä¸ã®ãããªå 容ã§ãã
id,createdAt,family_name,ããã¯ãã¼ã abcde12345,2024-01-25T12:34:56+09:00,ä½è¤,a.sato fghij12345,2024-02-20T12:34:56+09:00,ã¹ãºã,b.suzuki klmno12345,2023-12-31T04:12:55Z,ããã¯ã,c.takahashi
å®è£ ã¯ä»¥ä¸ã®ããã«ãªãã¾ãã
const fs = require('node:fs'); const { parse } = require('csv-parse/sync'); const input = fs.readFileSync('./test.csv'); const records = parse(input, { delimiter: ',', columns: true, }); console.log(records);
fsã使ã£ã¦csvãã¡ã¤ã«ãèªã¿è¾¼ã¿ããã®èªã¿è¾¼ã¿å
容ãcsv-parseã«æ¸¡ãã¾ãã
csv-parseã®ãªãã·ã§ã³ã¨ãã¦ã¯ãdelimiter
ããããã£ã§åºåãæåãã«ã³ãã«æå®ããcolumns
ããããã£ãtrue
ã«ãã¦csvãã¡ã¤ã«ã«ãããããããã¨ãæå®ãã¾ãã
ã³ã³ã½ã¼ã«ã®åºåçµæã¯ä»¥ä¸ã®ããã«é åã«ãªããé åã®è¦ç´ ã¯ãããããã¼ã¨ãããªãã¸ã§ã¯ãã«ãã¦ããã¾ãã
ã¡ãªã¿ã«ããããããªãå ´åã«ã¯ãé åè¦ç´ ãé åã«ãªãã¾ãã
[ { id: 'abcde12345', createdAt: '2024-01-25T12:34:56+09:00', family_name: 'ä½è¤', 'ããã¯ãã¼ã ': 'a.sato' }, { id: 'fghij12345', createdAt: '2024-02-20T12:34:56+09:00', family_name: 'ã¹ãºã', 'ããã¯ãã¼ã ': 'b.suzuki' }, { id: 'klmno12345', createdAt: '2023-12-31T04:12:55Z', family_name: 'ããã¯ã', 'ããã¯ãã¼ã ': 'c.takahashi' } ]
1è¡ãã¤csvãã¡ã¤ã«ãèªã¿è¾¼ã
csvãã¡ã¤ã«ã大ããå ´åãªã©ã¯ä¸æ¬ã§èªã¿è¾¼ã¾ãã1è¡ãã¤èªã¿è¾¼ãã»ããå®å ¨ã§ãã 以ä¸ã®ããã«ããã¨ã1è¡ãã¤åæã§èªã¿è¾¼ãã§å¦çããããªããã¨ãã§ãã¾ãã
for await...ofãã¡ããã¨ä½¿ã£ããã¨ããªãã£ãã®ã§ãåå¼·ã«ãªãã¾ããã
for await...of - JavaScript | MDN
const fs = require('node:fs'); const { parse } = require('csv-parse'); (async () => { const parser = fs.createReadStream('./test.csv').pipe(parse({ delimiter: ',', columns: true, })); const records = []; for await (const record of parser) { records.push(record); } console.log(records); })();
ã³ã³ã½ã¼ã«ã¸ã®åºåçµæã¯åã®å®è£ ã¨åããªã®ã§çç¥ãã¾ãã
S-JISã空è¡ãããåºåãæåã®ãã¨ï¼å¤ã®å·¦å´ï¼ã«ç©ºç½ããã®csvãã¡ã¤ã«ãèªã¿è¾¼ã
å®éã«ããããã§ãã¡ãã£ã¨å°ããããªãªãã·ã§ã³ã諸ã è©°ãè¾¼ãã csvãã¡ã¤ã«ãèªã¿è¾¼ãããã®csv-parseã®ãªãã·ã§ã³ã®ä½¿ãæ¹ã§ãã
ä»åèªã¿è¾¼ãCSVã¯ä»¥ä¸ã®ããã«ãªã£ã¦ãã¾ãã æåã³ã¼ãã¯S-JISã§ã4è¡ç®ã¨æçµè¡ã§ãã6è¡ç®ã空è¡ã§ãåºåãæåã§ããã«ã³ãã®ãã¨ï¼å¤ã®å·¦å´ï¼ã«åè§ã¹ãã¼ã¹ã1ï½2ã¤å ¥ã£ã¦ãã¾ãã
id, createdAt, family_name, ããã¯ãã¼ã abcde12345, 2024-01-25T12:34:56+09:00, ä½è¤, a.sato fghij12345, 2024-02-20T12:34:56+09:00, ã¹ãºã, b.suzuki klmno12345, 2023-12-31T04:12:55Z, ããã¯ã, c.takahashi
ãã®csvãã¡ã¤ã«ãèªã¿è¾¼ãã«ã¯ãã¾ãiconv-liteã使ã£ã¦S-JISãUTF8ã«å¤æãã¾ãã
ããã¦csv-parseã®ãªãã·ã§ã³ã¨ãã¦ã
ltrim
ããããã£ãtrue
ã«ãã¦å¤ã®å·¦å´ã®åè§ã¹ãã¼ã¹ãããªã ãã
skip_empty_lines
ããããã£ãtrue
ã¨ãã¦ç©ºè¡ãé¤å¤ãã
encoding
ããããã£ã§æç¤ºçã«utf8
ãæå®ï¼ããã©ã«ãã§ãutf8
ã§ããï¼ãã¾ãã
skip_empty_lines
ããããã£ã使ããªãå ´åï¼ããã©ã«ãã¯false
ï¼ã空è¡ãããã¨ã¨ã©ã¼ã«ãªã£ã¦ãã¾ãã¾ãã
const fs = require('node:fs'); const iconv = require('iconv-lite'); const { parse } = require('csv-parse'); const parser = fs.createReadStream('./test2.csv') .pipe(iconv.decodeStream('sjis')) .pipe(iconv.encodeStream('utf8')) .pipe(parse({ delimiter: ',', columns: true, ltrim: true, skip_empty_lines: true, encoding: 'utf8', }));
csv-parseã«ã¯ä»ã«ããªãã·ã§ã³ãããããããã¾ãã ã¡ããã¨ããã¥ã¡ã³ãã«ãªã£ã¦ããã®ã§ãä»ã«å°ã£ããã確èªãã ããã
ãããã«
csv-parseã使ã£ã¦CSVãã¡ã¤ã«ãèªã¿è¾¼ãã§ã¿ã¾ããã
1è¡ãã¤èªã¿è¾¼ãã¨ãã«ä½¿ã£ããfor await...ofãã¡ããã¨ä½¿ããããã«ãã¦ããããã§ãã