正規表現 (Regex) を利用してCSVファイルやTSVファイルを読み込む - C#プログラミング
https://www.ipentec.com/document/csharp-read-csv-file-by-regex
↑を参考にさせてもらいました。
js
1csvCRLF.split(/\r\n(?=(?:[^"]*"[^"]*")*[^"]*$)/g).slice(0,-1)
ただこのコードより、動作が保証された偉い人が作ったライブラリで解析するべきだと思います。
※以下の解説などは、自分の趣味の覚書みたいなものなので、読み飛ばしてもらって構いません。
csvでは、"
これの出現回数が奇数の時は囲まれてる文字列なので、これを数え偶数の時だけマッチさせる必要があります。
走査の流れ的に(?<=)
後読みすべきなんですが、後読みは繰り返し記号が使えない仕様。
なので方向を変えて、csv全文は偶数and後ろが偶数時は、先も偶数、という関係から(?=*$)
先読みでファイル終わりまでの"
を毎回全部数えます。全文なので$が改行で止まるmフラグは付けれません。
しかしこれは効率が悪く、エラーがあっても対応し辛いです。あと正規表現読んでると脳が疲れます。
なので前から数えるわかり易い方法で書いてみました。
js
1567
8const csvParseKun = (csv) => {
9 let re = /[,"\n]/g
10 // console.log([csv])
11 let parsed = [[]];
12 let key = 0
13 let guuSuu = true
14 let beginIndex = 0
15 let result
16 while (result = re.exec(csv)) {
17 if (result[0] === '"') { guuSuu = !guuSuu; continue }
18 if (guuSuu === false) continue
19 //”を適切に消し残す。
20 let str = csv.slice(beginIndex, result.index)
21 if (str[0] === '"') {
22 str = str.slice(1, -1).replace(/""/g, '"')
23 }
24 parsed[key].push(str)
25 //最後まで来たら終わり
26 if (re.lastIndex === csv.length) break
27 //次の準備
28 beginIndex = re.lastIndex
29 if (result[0] === '\n') { key += 1 ;parsed[key]=[]}
30 }
31 return parsed
32}
33
34//test用
35let csv = `0,"a",""",,","1改行\n","2改行\n\n","""""","末"\n"二行目"\n3,\n`
36//CRLFならLFに変換
37// let csv = csvCRLF.replace(/\r\n/g, '\n')
38console.log(csvParseKun(csv))
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/15 02:07