ダブルクォーテーションで囲ったセル内改行がある場合、そのまま改行コードでsplitしてしまうと結果の配列が崩れてしまいます。
行列の改行コードとセル内改行の改行コードを分けることで対応できます。
const csvDelimiter = ","
const tsvDelimiter = "\t"
xhr.responseText
.replace(/(?<=\t)(?!\"\")(?!\\\")\"[\s\S]*?(?!\"\")(?!\\\")\"(?=\t)(?=\r\n)/g, (match) => {
return match.replace(/\r\n/g, "\n")// セル内改行の改行コードCRLFをLFに変換
})// / \t + [""|\"]でない + " + 行またぎ含んだ文字列 + [""or\"]でない + " + [\t|\r\n]である /
.split(/\r\n/)//CRLF改行で区切る LFはセル内改行なので区切らない
.map(line => line.split(tsvDelimiter ))//区切り文字で区切る