2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

node.js 에서 csv 파일 처리하는 방법 (일본어)

Node.jsの実装例

node-csv を利用する例。

Node.jsの場合は、node-csvを用いることで、CSVの読み書きができる。
もし、cp932などの文字コードも試用する場合は、iconvモジュールも使用する。
インストール方法
node-csvのインストール
npm install csv
iconvのインストール
npm install iconv
CSVの読み込み例
var csv = require('csv');
var fs = require('fs');
var Iconv = require('iconv').Iconv;
var conv = new Iconv('cp932','utf-8');
dumpCsv('test1.csv');
dumpCsv('test2.csv');
dumpCsv('test3.csv');
dumpCsv('test4.csv');

function dumpCsv(path) {
  fs.readFile(path, function(err, sjisBuf) {
    var buf = conv.convert(sjisBuf);
    console.log(path + '================');
    csv.parse(buf.toString(),{comment:'#'}, function(err, data) {
      console.log(err);
      console.log(data);
    });
  });
}
実行結果
test1.csv================
null
[ [ 'ジャック', '12', '戦士', '説明1' ],
  [ 'バーン', '17', '騎士', '説明2' ],
  [ 'マァム', '15', '僧侶', '説明3' ] ]
test2.csv================
[Error: Invalid closing quote at line 1; found "ジ" instead of delimiter ","]
undefined
test3.csv================
null
[ [ 'ジャック', '12', '戦士', ',や"が入力可能' ],
  [ 'バーン', '17', '騎士', '説明2\r\n\r\nダブルクォート中に空の改行がある場合' ],
  [ 'マァム', '15', '僧侶', '説明3' ] ]
test4.csv================
null
[ [ 'ジャック', '12' ], [ 'バーン' ], [ 'マァム', '15', '僧侶', '説明3' ] ]
test2.csvの読み込み結果がエラーになっている。
csv.parseは次のようにコメント中にダブルクォーテーションのあるデータを読み込めない。
#名前,歳,クラス,説明に(",)を入れる
これを直すには、node_modules/csv/node_modules/csv-parse/lib/index.jsに次のようなパッチを適用する必要がある。
--- node_modules/csv/node_modules/csv-parse/lib/index_bk.js 2014-06-20 17:36:56.000000000 +0900
+++ node_modules/csv/node_modules/csv-parse/lib/index.js    2014-07-22 22:06:12.826116745 +0900
@@ -253,7 +253,7 @@
         this.closingQuote = i;
         i++;
         continue;
-      } else if (!this.field) {
+      } else if (!this.field && !this.commenting) {
         this.quoting = true;
         i++;
         continue;

これを当てた場合の結果は次のようになる。
実行結果
test2.csv================
null
[ [ 'ジャック', '12', '戦士', ',や"が入力可能' ],
  [ 'バーン', '17', '騎士', '説明2\r\n改行を行う' ],
  [ 'マァム', '15', '僧侶', '説明3' ] ]
CSVの書き込み例
var csv = require('csv')
var data = [
  ['xx', 'ああああ', 1],
  ['id', '"atagfa,asteata','#teat','aaa'],
  ['newline', 'tests\n\ntesat']
];
console.log(data);
csv.stringify(data, {quoted: true}, function(err, output) {
  console.log(err);
  console.log(output);
});
作成される文字列
"xx","ああああ","1"
"id","""atagfa,asteata","#teat","aaa"
"newline","tests

tesat"

以上の結果より、node-csvを使用した場合は次のことがいえる。
・node-csvを使用するとCSVの読み書きが行える。
・コメントを取り扱うことも可能である。
・ただし、コメント周りに上記で説明した通りのバグか仕様があるので自分でパッチを作成して適用するか、コメントを使用しない。

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법