• 締切済み

JS 分割子が混在したデータを成型するには?

<h1>JS 分割子が混在したデータを成型するには</h1> <pre> さまざまな分割子が混在したデータがあります。 これを1つの分割子に統一するには どんなコードでできますか? replaceメソッドを用いたら 芋ずる式のようになってしまい、coolじゃない(?) 【仕様】 [分割子] ・二重引用符 ・一重引用符 ・タブ区切り  ・・・ 単語と単語の間 ・半角空白       同上 ・パイプ(縦棒)・・・ 行頭と末尾に有る、無いの2ケース [データ型式] 1列目:3桁カンマ区切り 2列目:文字データ 3列目:整数・小数(負数を含む) [備考] 空白行は詰めて作表する </pre> <pre id="data"> 1,234 あさがお 23.45 7,904 みかん 0.92 5,021 うさぎ 5.63 8,753 えんどう 1.724 2,657 いちご 10.87 9,841 ひまわり 77.33 432 ベニバナ 4.09 7,123 メロン 98.14 432 しらゆり 4.09 6,722 ナツメグ 65.1 "333,333","fish","67.82" "98,765","animal","26.5" "216,017","lion","5.74" "60,580","cat","31.07" "43,604","river","25.94" '90,742','lamp','0.45' '23,809','teacup','7.23' '3,582','dish','80.72' '5,600','stove','59.35' '4,65','soap','23.84' 9,001|violin|28.03 5,345|guitar|4.52 |4,890|goldfish|135.45| |2,8760|mountain|79.43| |5,032|radio|17.03| </pre> <div> <button id="button1">成型する</button> </div> <textarea id="output" cols=60 rows=30> </textarea> <script> //例 二重引用符で統一する let format ='"'; button1.onclick = function(){ // ??? }; </script> 正規表現にくわしい方のお力添えをお待ちしております。

みんなの回答

回答No.2

1.切り取り文字を厳格にする 2.跳ねられた部分(書式外)は lastIndex を監視していれば判別できるんじゃね?

retorofan
質問者

補足

この度は、肝心な要件を記述しなかったために 大変なご苦労とご迷惑をおかけしてしまいました。 ついては、この質問は閉じさせて頂き、 新たに質問させて頂くことにしました。 質問者の心情を斟酌の上、今後ともよろしくお願いいたします。

回答No.1

4,65 と 2.8760 とは? <!DOCTYPE html> <head> <meta charset="utf-8"> <title></title> <body> <textarea id="output" cols=60 rows=30></textarea> <script> const D= ` 1,234 あさがお 23.45 7,904 みかん 0.92 5,021 うさぎ 5.63 8,753 えんどう 1.724 2,657 いちご 10.87 9,841 ひまわり 77.33 432 ベニバナ 4.09 7,123 メロン 98.14 432 しらゆり 4.09 6,722 ナツメグ 65.1 "333,333","fish","67.82" "98,765","animal","26.5" "216,017","lion","5.74" "60,580","cat","31.07" "43,604","river","25.94" '90,742','lamp','0.45' '23,809','teacup','7.23' '3,582','dish','80.72' '5,600','stove','59.35' '4,65','soap','23.84' 9,001|violin|28.03 5,345|guitar|4.52 |4,890|goldfish|135.45| |2,8760|mountain|79.43| |5,032|radio|17.03| `; const splitter = `[\\t,|\\u0020]`, lineHead = `(?:^|\\s*?)`, lineFeed = `(?:\\r\\n|\\r|\\n|$)`, number = `[+-]?[0-9]{1,3}(?:,[0-9]{3})?(?:\\.(?:[0-9]+)?)?`, text = `.*`, field0 = `(?=".*"|'.*'|[^"'].*[^"'])(?:["'|]?)(${number}?)(?:["'|])?`, field1 = `(?:["'|]?)(${text}?)(?:["'|]?)`, field2 = field0, format = lineHead + field0 + splitter + field1 + splitter + field2 + lineFeed, reg = new RegExp (format, 'g'); let ary = [ ], a; while (a = reg.exec (D)) ary.push (a.slice (1).map (_=>`"${_}"`)); output.value = ary.join `\n`; </script>

retorofan
質問者

お礼

いつもご協力頂き、感謝しております。

retorofan
質問者

補足

4,65 と 2.8760 とは? 申し訳ございません。 仕様の記述が不足していました。 元データの入力エラーとお考えください。 その場合は、「***」と出力したいです。 よろしくお願いいたします。

関連するQ&A