• 締切済み

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

  • 再挑戦:分割子が混在したデータの成型コードは?

    <h1>JS 分割子が混在したデータの成型コードは?</h1> <pre> さまざまな分割子が混在したデータがあります。 これを1つの分割子に統一するには どんなコードでできますか? 【仕様】 [分割子] ・二重引用符 ・一重引用符 ・タブ区切り  ・・・ 単語と単語の間 ・半角空白       同上 ・パイプ(縦棒)・・・ 行頭と末尾に有る、無いの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> //例 button1.onclick = function(){ // step.1 データから、分割子を除いた単語として配列に格納 // step.2 エラーデータは「****」に変換 // step.3 分割子を指定してテキストエリアに出力 }; </script> くわしい方のお力添えをお待ちしております。

  • JS ベタ打ち原稿を成型して出力するには?

     JavaScript ベタ打ち原稿を成型して出力するには? 未編集の洋楽プレイリストがあります。 これを、次の書式どおりに成型することにします。 [成型後の書式] 2桁の連番_歌手名_-_曲名_(分:秒) or (西暦年) [_:半角空白] <仕様> ・jQuery等のプラグインは不使用のこと ・「連番、歌手名、曲名、演奏時間」が1行ずつのまとまり ・演奏時間の箇所が 西暦年の場合がある ・歌手名、曲名に 次の記号が含まれている場合がある  アンパサンド、半角括弧、アポストロフィ、バッククォート (& ( ) ’ `) 手順1 テキストエリア「genkou」にベタ打ち原稿を貼り付けます。 手順2 実行ボタンを押すと、テキストエリア「result」に成型して出力します。 そうするためには、どのような JavaScriptコードになりますか。 [HTML] <textarea id="genkou" cols="100" rows="30"> 01 - Artie Garr (a.k.a Art Garfunkel) - Beat Love (1959) 02 - Mark Dinning - Loving Touch (2:10) 03 - Petty Booka - Bla Bla Bla Cha Cha Cha (2:28) 04 - Sam Fletcher - I'd Think It Over (2:38) 05 - Untouchables - Raisin Sugar Cane (2:11) 06 - Esther Phillips - Just Say Goodbye (2:18) 07 - Eddie Holland - Jamie (2:23) 08 - Della Reese - Tea For Two (2:13) 09 - Danny Winchell - Por Favor (2:10) 10 - Clyde Otis - Jungle Drums (1:56) 11 - Christine Quaite - Your Nose Is Gonna Grow (2:10) 12 - Martin Bet - I Know A Girl (2:01) 13 - Arthur Alexander - Anna (2:52) 14 - Mickey & Sylvia - Love Is Strange (2:54) 15 - Richard Anthony - Cin Cin (Chin Chin) (3:02) 16 - Sarah Vaughan - Broken Hearted Melody (2:55) 17 - Aphrodite's Child - Rain And Tears (1968) 18 - Nico Landers - Stil In De Straten (2:26) 19 - Ginny Arnell - He's My Little Devil (2:10) 20 - Azie Mortimer - Lips (2:22) 21 - Ava Max - Salt (2019) 22 - Gun`s N Roses - Don't Cry (1991) 23 - Sarah Vaughan - Smooth Operator (2:27) 24 - The Weeknd - Save Your Tears (2020) 25 - Martha Reeves & The Vandellas - Nowhere To Run </textarea> <div> <button id="btn">実行ボタン</button> </div> <textarea id="result" cols="100" rows="10" placeholder="成型後" readonly></textarea> </textarea>

  • load dataするときに、最後の列(文字列)がちゃんと入らない

    load data infile~で一括登録する上で、 最後の列に、空白またはnull指定しても、 ちゃんと登録されてくれません。 create table ~( id char(12) not null primary key, 1R varchar(12), 2R varchar(12), 3R varchar(12)); 実際に一括登録するデータは以下です(スペースはタブ区切り) 2R・3Rに対して、このように実験的に入れてみました。 1 aa1 \N \N\n >Nullを指定 2 bb1 \n   >タブ区切りの空白指定 3 cc1\n    >タブ自体をを書かない 登録結果は以下のようになりました。 1 aa1 NULL N 2 bb1 3 cc1 NULL NULL id1の行については、2RにはNULL値が登録できたのですが、 3Rには「N」と表示されています。 しかし、ただのNではないみたいで、 (where 3R like 'N_')としないとヒットしません。 また、'_'は空白ではないらしく正体不明です。 id2の行については、2Rは空白になっていますが、 3Rは(where 3R = '')としてもヒットせず、 なぜか(where 3R like '_')にヒットします。 これもまた、'_'は空白ではありません。 冒頭にも書きましたが、このように 最後の列にうまく空白やNullが登録されません。 id3の行のように、 値のある列までで閉じてあげると綺麗に入ります。 力ずくでid3のように成形してあげることもできますが、 一括登録という便利な機能を使う上で何か違う気がします。 環境 windowsXP+MySQL5.0 文字数制限のためあまり詳しく掛けませんでした。不足な点があれば補足致しますので、 よろしくおねがいします。

    • ベストアンサー
    • MySQL
  • エクセル教えてください 重複データの削除方法

    エクセルは良く使っていますが、レベルは初級の上です。 同一セル内に複数の重複データが入っていますが、重複しないものを抽出し 新しいセルに入れたいと思っています。 重複データの区切りは、セミコロン";" パイプ区切り"|",空白、改行が混在しています。 重複しないものを、新しいセルに入れたいのですが、どのようにしたら良いでしょうか? 新しいセルでのデータ区切りは、コンマ(又はパイプ区切り)にしたいと思っています。   例で説明します。 A列(番号) B列(元のデータ)             C列(重複を除いたデータ)  1      タイ ベトナム 中国|タイ|タイ         タイ,ベトナム,中国    2      インド ベトナム|インド タイ |インド 中国  インド,ベトナム,タイ,中国 ※B列のデータを重複を除いて、C列に入れたいと思っています ※2行のデータを例にしましたが、実際には2万くらいデータがあります ※マクロは全くわからないので、多少の手作業があっても関数レベルで やれると助かります。(いまから、マクロを勉強してもよいでしょうか??) 良い方法をアドバイスいただければ助かります。

  • オープンオフィス・セルの分割

    オープンオフィスでcsvデータを読み込むと 一つのセルにすべてが固まって表示されてしまうので データ→テキストから列へ で、区切り記号を選択して増やしてみましたが 1列目は分割されたのですが、2列目以降が分割されないままになってしまいます これはどうやったらきれいに分割されるんでしょうか? 過去質問などでも探してみましたが、よくわからず・・ それで質問させていただいた次第です 申し訳ありませんが、当方PCがすごく苦手で csvファイルを触るのも今回が初めてのド素人です。 できましたら噛み砕きすぎるくらい噛み砕いて教えて頂けると助かります。 お手数おかけしますがどうぞよろしくお願いいたします。

  • JavaScript 手作業から解放されたいのです

    今、インラインフレームにデータを読み込んで作表するサンプルを作成中です。 インラインフレームには select() メソッドが使えないために 手作業でテキストエリアに copy&pasteしている状態です。 この手作業から解放されたいのですが、どういうコードでできますか? スキルある方のお力添えをお待ちしております。 【親ページ】parent.html <body> <div>parent.html 親ページです.</div> <style> body { background: lavender; } .wrap { list-style-type: none; display: flex; width: 640px; padding: 1.5em; background: lightgreen; border-radius: 10px; } form > div { margin-top: 1em; font-weight: bold; } label { display: block; } pre b { color: red; } #iframe3 { width: 300px; height: 160px; background: #eee; } #textArea { margin-left: 10px; width: 300px; height: 160px; } </style> <pre> 【テーマ】子ページ内のデータで作表する <条件> ・子ページの情報で親ページに作表する ・ローカル環境(当然 Ajax(XMLHttpRequest)は対象外、new FileReader不使用) ・ファイルは、親子とも同じ場所 ・現在は、<b>読込ファイル選択 ▶ IFRAMEをCTRL+C ▶ TEXTAREAでCTRL+V ▶ 作表ボタン押下 ▶ 作表</b>  理想は、手作業を省略して、<b>読込ファイル選択 ▶ 作表</b> </pre> <ul class="wrap"> <li>(1)[IFRAME](理想は非表示に) <iframe id="iframe3" src="./20230515-child.tsv" title="子ページ"> </iframe> </li> <li> (2)[TEXTAREA](理想は非表示に) <textarea id="textArea" placeholder="貼付場所"></textarea> </li> </ul> <form name="form1"> <div>読込データファイルの選択</div> <label><input name="cbox" type="radio" value="0" checked> 1.TSVファイル (タブ区切り .tsv)</label> <label><input name="cbox" type="radio" value="1"> 2.HTMLファイル</label> </form> <p> <button id="button1">作表</button> <table id="listTable"></table> </p> <script> (function () { //エレメント const iframe = document.getElementById('iframe3'); const table = document.getElementById('listTable'); const textArea = document.getElementById('textArea'); const button1 = document.getElementById('button1'); //読み込みファイルの選択 document.form1.onchange = function(event) { let n = event.target.value; iframe.src = "./child." + ["tsv","html"][n]; } //作表処理 button1.onclick = function (){ // 値を全選択してコピー (※使用不可能) // iframe.select(); // var result = document.execCommand("copy"); //------------------------------------------------------------- // 整形 文字データの配列化 作表 // (略) //------------------------------------------------------------- }; })(); </script> </body> 【子ページ1】child.tsv 番号 名称 半径 衛星個数 1 水星 2,439 0 2 金星 6,051 0 3 地球 6,378 1 4 火星 3,396 2 5 木星 71,492 95 6 土星 60,268 104 7 天王星 25,559 27 8 海王星 24,764 14 9 冥王星 1,188 5 【子ページ2】child.html <pre> 番号 名称 半径 衛星個数 1 水星 2,439 0 2 金星 6,051 0 3 地球 6,378 1 4 火星 3,396 2 5 木星 71,492 95 6 土星 60,268 104 7 天王星 25,559 27 8 海王星 24,764 14 9 冥王星 1,188 5 </pre>

  • OpenOfficeでデータファイルを開く

    OpenOfficeのcalculatorでデータファイル(数値が並んだただのアスキーファイル) を開きたいのですが、どうしてもwriterが起動してしまって calculatorで開くことができません。 excelでやるように、空白区切りでセルごとのデータを 分割して入れたいのですが、どのようにすればいいでしょうか。 宜しくお願いします。

  • substringで文字を分割

    全角80桁の文字列を全角空白を利用して4分割したいのですが 下記にご質問内容を記載します。 String str = new String(住所漢字); Matcher j = pattern2.matcher(住所漢字); Pattern pattern2 = Pattern.compile("^.{1,20} ");で 文字列の先頭から始まって半角空白で終わる最大21文字 (最後の全角空白を含む)にマッチさせた文字列に Matcher j = pattern2.matcher(住所漢字); while(j.find()) { 正規表現で抜き出した文字列の文字カウントをチェック int mojiLength = i.group().length(); String iNewString = tmp.substring(mojiLength); out.print(j.group()+","+iNewString); として、正規表現でマッチさせた文字列以降を substringで抜き出したのですが それ以降の文字列も同じようにして substringで抜き出した20文字以降の文字列に 先に設定した正規表現を利用して分割して カンマ区切の4分割にしたいのですが この先の方法が分からず色々調べている最中です。 すいませんがぜひアドバイスお願いします。

    • ベストアンサー
    • Java
  • データファイルの入力方法

    データファイルの入力方法についての質問です。 フォーマットは以下↓の通り、1,2列目が日付,時間となっています。 (表記の都合上、半角スペースを_で置換しています。) 各行それぞれ3列目から最後の列までの和を計算したいと思っています。 問題点は以下の3点です ・1,2列目をとばしたい ・行によって列の数が異なる ・列の区切りのスペースの数がバラバラ 上の場合以外(つまりデータのみで列の数がそろっていて区切りも統一されている) のファイルでしたらfscanfを使ってできます。 ご助言をよろしくお願いします。 2006/06/10____10:10:10____320.25____351.2____561.00___2646.00 2006/06/10____10:10:11____320.000___310.00___561.00 2006/06/10____10:10:12____320.000___310.00___561.00___2646.0 2006/06/10____10:10:13____320.000___310.00___561.0____2646.00 2006/06/10____10:10:14____320.0_____310.00___561.00___260.0 2006/06/10____10:10:15____310.00____561.00___2646.00 2006/06/10____10:10:16____320.00____310.00___561.00___2646.00 2006/06/10____10:10:17____320.000___310.00___561.0____2646.0 2006/06/10____10:10:18____310.0_____561.00___2646.00 2006/06/10____10:10:19____320.000___310.00___561.00___2646.0 2006/06/10____10:10:20____320.000___310.00___561.00___2646.00 _

  • ボタンを押すとデータ表示、再度押すと非表示

    ボタンを押すとデータが表示されるjqueryを利用したjavascriptがあります。 このボタンを再度クリックすると非表示にしたいと考えています。 奇数回クリック=表示 偶数回クリック=非表示 という形です。 ご教授いただきたくお願いいたします。 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script type="text/javascript"> jQuery(function($){ $("#btn0").click(function (e) { e.preventDefault(); $("#data").show(); }); </script> <button class="button18" id="btn0">ボタン</button> <div id="data" style="display:none"> データ </div>