4
2
みなさんがどのようにしているか知りたいです。
例えば
piyo1=hoge1,piyo2=hoge2...
↓
{'piyo1': 'hoge1', 'piyo2': 'hoge2', ...}
といったような感じで変換したい時があります。
プログラムを組めばできるかと思いますが、
皆さんこのようにテキストを別の形式のテキストに特定のルールに沿って変換したいとき、どのような感じで変換したりしていますでしょうか?
特定のルールとは、順次、条件分岐、反復処理のプロセスに沿って変換することを指します。
さら複雑になると、順次、条件分岐、反復をもっと組み合わせて、txtファイルを変換したい時があります。
txtファイルからtxtファイルへの変換で何か効率の良い方法をご存じの方はいませんか?
背景、状況
私自身プログラムを作っていて、よくこのようなテキストを特定のルールに沿って別のtxtファイルに変換したい時がよくあります。
しかしプログラムを組んでやっていると時間が長くかかってしまうことがよくあります。
そこで、そうすればもっと効率よくテキストを変換できるのか気になりました。
テキストは数行くらいのものを変換したい時から、、何百行と長いものまで変換したいと思う時もあります。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答25件
#1
総合スコア23549
投稿2023/07/05 10:24
この位のだったら、editorの変換を使ってることが多いです。
= ⇒ ': '
, ⇒ ', '
最後に両端を手作業
いや、じつはもっと複雑で、 ということでしたらその見本を
#2
総合スコア85778
投稿2023/07/05 10:31
編集2023/07/05 12:02ケースバイケースとしか言いようがないです。
単純な構造で、数行から数百行程度の短い物ならエディターも選択肢になりますね。
・普通のエディターの置換機能で
・viというかexのコマンドで
・sed
・grep+アルファ
・awk
・Ruby(ここは人により Perl Pythonなど)
・Excel
くらいの中からそのケースで一番楽に出来そうな物を選択しています。
おかきのケースなら、sed -E 's/(\w+)=(\w+)/"\1":"\2"/g;s/^/\{/;s/$/\}/'
でしょうか。
面倒くさいので二重引用符にしてます。
区切り記号が引用符に囲まれてデータの一部になっているようなCSVやJSON等なら、何らかの言語+ライブラリで。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#3
総合スコア18189
投稿2023/07/05 11:20
編集2023/07/05 11:30皆さんこのようにテキストを別の形式のテキストに特定のルールに沿って変換したいとき、どのような感じで変換したりしていますでしょうか?
自前で実装しなくても、既存の仕様で対応できることが多いので、仕様書を調べます。
例えば
piyo1=hoge1,piyo2=hoge2...
↓
{'piyo1': 'hoge1', 'piyo2': 'hoge2', ...}といったような感じで変換したい時があります。
クエリ文字列をオブジェクトに格納しているように見えるので、URL#searchParams
を使用して変換します。
javascript
1'use strict'; 2const string = 'piyo1=hoge1,piyo2=hoge2'; 3const searchParams = new URL('https://example.com/?' + string.replace(/,/g, '&')).searchParams; 4 5console.log(searchParams); 6console.log([...searchParams]); 7console.log([...searchParams].reduce( 8 (obj, current) => (obj[current[0]] = current[1], obj) 9,{}));
期待する動作にもよると思いますが、この場合は new Object
に変換しなくても良い場合が多い印象です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア38339
投稿2023/07/05 11:44
編集2023/07/05 12:32- まずはその「特定のルール」というのを順次、条件分岐、反復処理のみで日本語の箇条書きのような形の手順書(マニュアル) をつくります。
- 次に、つくったマニュアルに沿って、いくつかの適切な例題(テストデータ)を自分が手作業で変換してみてマニュアルの正しさを確認します。
このマニュアルさえあれば人間だろうがコンピュータだろうがそのとうりにすれば変換できるはずですので…
- あとはそれを好きなプログラミング言語に置き換えます。
追記
何か効率の良い方法をご存じの方はいませんか?
以上であげたことを、できるかぎり脳内で「えいやっ」とやってしまうと効率というか速くできます。
これやってる最中の人を他人が見ると
ただ虚空やディスプレイをぼーっと眺めているだけなのに目が異常にキョロキョロしてるみたいで
相当気持ち悪いみたいですが。
Python
1s='piyo1=hoge1,piyo2=hoge2,piyo2=hoge3' 2ret = '{'+', '.join(map(lambda e:f"'{e[0]}':'{e[1]}'",map(lambda e:e.split('='),s.split(','))))+'}' 3print(ret) # {'piyo1':'hoge1', 'piyo2':'hoge2', 'piyo2':'hoge3'}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#5
総合スコア18716
投稿2023/07/05 15:49
この回答はChatGPT4及びChatGPT3.5により生成された文章です
前提(ここは人間が生成した文章です)
変換ルールとテスト仕様を自分で定義できる前提とした場合
- ある程度経験のあるプログラマー得意な言語で書いてしまうのが早い
- ルールを定義出来るがコードに落とし込むのに時間がかかる場合はChatGPT(なり、他のLLMなり)にコードを生成させて→テストと修正で効率化が可能なケースも多いかと思います。
テスト仕様を自分で定義出来ない場合は、どっちの場合でも正確性の保証が出来ないので、テキストエディタやエクセルを駆使して頑張るしかないと思います。
Chat-GPT4の場合
(質問)
PHPで以下のテキスト変換を行うプログラムを教えてください
piyo1=hoge1,piyo2=hoge2...
↓
{'piyo1': 'hoge1', 'piyo2': 'hoge2', ...}
回答
ChatGPT
以下にそのテキスト変換を行うPHPのコードを提供します。テキストをコンマで分割し、その後各要素を等号で分割して配列に格納しています。
php
1Copy code 2<?php 3$input = "piyo1=hoge1,piyo2=hoge2"; // この部分に変換したいテキストを入れてください 4$elements = explode(",", $input); 5 6$result = []; 7foreach ($elements as $element) { 8 $pair = explode("=", $element); 9 if (count($pair) == 2) { 10 $result[$pair[0]] = $pair[1]; 11 } 12} 13 14$json = json_encode($result, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); 15echo $json; 16?> 17
このプログラムは、入力のテキストを, で分割し、各結果を=で分割してキーと値の組を作成します。最終的に、結果は JSON 形式で出力されます。注意点としては、入力テキストが正しい形式になっていること(つまり、キー=値の形式であり、その組が,で区切られていること)を確認してください。
Chat-GPT3.5の場合
[質問]
PHPで以下のテキスト変換を行うプログラムを教えてください
piyo1=hoge1,piyo2=hoge2...
↓
{'piyo1': 'hoge1', 'piyo2': 'hoge2', ...}
ChatGPT
以下は、PHPで指定されたテキスト変換を行うプログラムの例です。
php
1<?php 2$text = "piyo1=hoge1,piyo2=hoge2..."; 3 4// テキストをカンマで分割 5$parts = explode(",", $text); 6 7$result = array(); 8 9foreach ($parts as $part) { 10 // イコールで分割 11 $pair = explode("=", $part); 12 13 // キーと値を取得 14 $key = trim($pair[0]); 15 $value = trim($pair[1]); 16 17 // 配列に追加 18 $result[$key] = $value; 19} 20 21// 結果を表示 22echo json_encode($result); 23?>
このプログラムでは、与えられたテキストをカンマで分割し、それぞれの要素をイコールでさらに分割します。分割されたキーと値のペアは、連想配列である $result に追加されます。最後に、json_encode() 関数を使用して連想配列を JSON 形式に変換し、結果を表示します。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#6
総合スコア20574
投稿2023/07/05 19:58
例えば
piyo1=hoge1,piyo2=hoge2...
↓
{'piyo1': 'hoge1', 'piyo2': 'hoge2', ...}といったような感じで変換したい時があります。
mlr: like awk, sed, cut, join, and sort for name-indexed data such as CSV and tabular JSON で以下の様に。
bash
1bash$ echo 'piyo1=hoge1,piyo2=hoge2,piyo3=hoge3' | \ 2mlr put -q $' 3 printn "{"; 4 b = false; 5 for (k, v in $*) { 6 if (b) { printn ", " } 7 printn "\'".k."\': \'".v."\'"; 8 b = true; 9 } 10 print "}";' 11 12{'piyo1': 'hoge1', 'piyo2': 'hoge2', 'piyo3': 'hoge3'}
シングルクォートではなく、ダブルクォートでもよいのであれば以下。
bash
1bash$ echo 'piyo1=hoge1,piyo2=hoge2,piyo3=hoge3' | \ 2 mlr put -q 'dump $*' | jq -M -c '.' 3 4{"piyo1":"hoge1","piyo2":"hoge2","piyo3":"hoge3"}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア23549
投稿2023/07/05 23:59
編集2023/07/06 00:11ruby なら
ruby
1require 'json' 2s="piyo1=hoge1,piyo2=hoge2,piyo3=hoge3,piyo4=hoge4" 3s.split(',').map{|t| t.split('=')}.to_h.to_json.gsub(/"/,"'")
こっちのが短いか
Hash[*s.split(/[,=]/)].to_json.gsub(/"/,"'")
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#9
総合スコア116466
投稿2023/07/07 02:08
編集2023/07/07 02:11javascript
1const txt="piyo1=hoge1,piyo2=hoge2,piyo3=hoge3"; 2const usp=new URLSearchParams(txt.replace(/,/g,'&')); 3const result=JSON.stringify(Object.fromEntries([...usp.entries()])); 4console.log(result);
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#11
総合スコア4443
投稿2023/07/10 04:06
プログラムを書くほどでもなく、実行方法は「使い捨て」でいい、ということでしょうか。
ご質問に挙がっているようなものであれば単純な置換だけでもできそうですし、やや複雑な置換ならsed、AWK、Perlなどのワンライナーですませることも多いと思います。そういった方法では見通しが悪いときに、エディタのマクロ機能を使ったりします。たとえば例のテキストをYAMLにしたいとき、
- テキストの先頭へ移動。
- 次を実行しつつマクロ登録。
/=/
を検索 ("=" の直前へ移動)。
Delete
("=" を削除)。
":"
" "
とタイプ。
/,|$/
を検索 ("," の直前またはテキスト末尾へ移動)。
Delete
("," があれば削除)。
Enter
(改行し次行の行頭へ移動)。 - 登録したマクロを繰り返し実行し、テキスト末尾に達したらやめる。
結果、
piyo1: hoge1 piyo2: hoge2 piyo2: hoge3 ...
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#12
退会済みユーザー
総合スコア0
投稿2023/07/11 01:08
出力がJSONならjqも適材適所でしょう。-Rでraw inputモードにして文字列を読み込んでいます。
json
1% echo 'piyo1=hoge1,piyo2=hoge2' | jq -R 'split(",") | map(split("=") | {(.[0]): .[1]}) | add' 2 3{ 4 "piyo1": "hoge1", 5 "piyo2": "hoge2" 6}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#13
総合スコア136
投稿2023/07/11 01:52
編集2023/07/11 02:02テキストを別の形式のテキストに特定のルールに沿って変換したい
この目的であれば正規表現置換が適していると思います。
また、正規表現のみで表現の難しい反復などはプログラムで補います。
JavaScript実装例
javascript
1const str = 'piyo1=hoge1,piyo2=hoge2,piyo3=hoge3'; 2console.log(`{${str.replace(/(.+?)=(.+?)(,|$)/g, "'$1':'$2'$3")}}`); 3// -> {'piyo1':'hoge1','piyo2':'hoge2','piyo3':'hoge3'}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#15
総合スコア85778
投稿2023/07/12 06:16
テキストエディタの置換と手作業を併用する#1が最も適切なもののように思います。
質問に出ている例だとそうですね。
ギガバイト単位のファイルだとエディターは躊躇しますが。
単なる一例にこだわらず、
ちょっとしたテキストを、特定のルールに沿って変換したいとき、
という一般論だと、
ケースバイケースとしか言いようがないです。
という事になるかと思いますが、若者の多くは「都度、方法を考える(方法を選択する)」というのを忌避する傾向にある気がしています。「こういう問題はこう解く」という回答を欲しているというか。安易に「ベストプラクティス」という言葉を使って質問している人とか。まあ、全員がそうではないですが。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#16
総合スコア28662
投稿2023/07/12 07:07
編集2023/07/12 07:15#15
プログラムを組むのが苦手なので組まずにという条件が質問に入っています。
↓
しかしプログラムを組んでやっていると時間が長くかかってしまうことがよくあります。
そこで、そうすればもっと効率よくテキストを変換できるのか気になりました。
「もっと効率よく」という言葉は、前半部分を加味すると「プログラミングをするより短時間で」という意味でしょう。
で、回答の中にはコードを載せている人もいますが、それこそ質問の一例に対してそのデータにしか使えないコードであり、聞いていることとはズレがあるように思います。
それに対して質問者が全く意思表示しないために主題がぼやけ、意見交換としてカオスなことになっています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#17
総合スコア4443
投稿2023/07/12 08:04
今の若者がみんなそうではないでしょうが、間違いを指摘されることを恐れすぎではないかと感じさせる例はたまに見ますね。某所で、プログラムのテストケースがなかなかパスしないことに「重箱の隅をつつくような間違いを指摘されるばかり」とぼやいているかたがいました (テストとは)。
――とはいうものの今では世の中の半分は私より歳下なので、「今の若者は」という繰り言は自分が少数派だと認めるのと同じこと、詮ないことです。
ちょっと脱線。
正規表現による置換はそんなによいものではないと私は思っています。シンタクスが分かりにくい割に案外できることが少ない。複雑なマッチングや置換をしようとするとすぐ期待通りの動作をしなくなる (期待通りに動作するように書くのが難しいか、単に不可能)。特に、再帰的な構造を持ったテキストの処理は事実上できない (やろうとして虚しい努力をしている人をたまに見かけます。かつての私もそうでした)。
また、最近の正規表現エンジンはNFAの実装が多いですからReDoSも心配で、私は最近は簡単なプログラムでも正規表現を使うのを控えるようにしています。実際、プログラム的なテキスト処理では多くが静的パターンの完全一致か前方一致だけですみ、たまに中間一致も使えばほとんどのケースに対応できてしまいます (私の経験の範囲では)。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#18
総合スコア23549
投稿2023/07/12 08:51
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#19
総合スコア13692
投稿2023/07/12 09:13
私の回答#10 はちょとネタ回答みたいになってしまっているので少し補足したいと思います。
その前に、
#15
プログラムを組むのが苦手なので組まずにという条件が質問に入っています。
という指摘について考えておきたい。
しかしプログラムを組んでやっていると時間が長くかかってしまうことがよくあります。
そこで、そうすればもっと効率よくテキストを変換できるのか気になりました。「もっと効率よく」という言葉は、前半部分を加味すると「プログラミングをするより短時間で」という意味でしょう。
とも確かに読めます。
しかし、「もっと効率よくプログラムを書いて処理する」も要求を満たしているように思えるし、質問の「複雑になると、順次、条件分岐、反復をもっと組み合わせて」を考慮すれば、なおさら「プログラムを使う」方向に誘導するのが妥当であろうと私は考えます。
例題に関して言えば、perlワンライナーは実用的な解決案です。
echo 'piyo1=hoge1,piyo2=hoge2,piyo3=hoge3'| \ perl -nle '$q=chr(39); s/=/$q: $q/g; s/,/$q, $q/g; print "{$q$_$q}"'
こんな感じで、行ごとに完結する処理であれば、多くの場合perlがもっともシンプルです。
もっとも、この例では、引用符をエスケープしたいので少し見にくくなってしまいました。使い捨てのワンライナーにするのではなくスクリプトファイルに書き起こして使うことにすれば、コードはもっと見やすく書けます。
ファイルにしておくと、それ自体が作業記録になるので、あとあとチェックのときに助かることが多いです。この点もエディタで一括置換よりも有利であることは指摘しておく価値があるでしょう。マクロを組んで保存する?いやいやさすがにマクロよりはperlの方が読みやすいでしょ?
# test.pl s/=/': '/g; s/,/', '/g; print "{'$_'}";
perl -nl test.pl < input.txt > output.txt
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#20
総合スコア4443
投稿2023/07/12 09:47
編集2023/07/12 10:25バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#21
総合スコア85778
投稿2023/07/12 10:55
みなさんがどのようにしているか知りたいです。
ということなので、プログラミングできない人限定でなくて、一般論で良いかと思います。
エディターでやる方が簡単ならエディターでやれば良いし、エディターの置換などの機能では無理なケースは、
・プログラム/スクリプトを書く(sedやjq等の汎用ツールのコマンドライン含む)
・丁度目的にハマる専用ツールを探して使う(画像ファイルのリネームとかなら専用ツールが便利)
・手作業で1つずつ編集加工
でしょうか。1回切りで同じ作業は今後発生しないのなら、量によっては1つずつ手作業も有力な選択肢です(画面上で数行で収まるくらいのデータ量。量が多いとタイプミスのチェックが大変)。
そこで、そうすればもっと効率よくテキストを変換できるのか気になりました。
手持ちの引き出しの中で、ケースバイケースで一番効率よい物を選択するというのが、私の最初の回答です。(上に書いたように、同じ作業が今後どの程度発生するのかどうかも選択に影響しますね)
質問者が夢想しているかもしれない「このやり方を覚えれば、どんな場合でもプログラムを書くより効率よく出来るよ」という方法は無いという回答でもあります。
「みなさんがどのようにしているか知りたいです。」ということなので、私の引き出しを挙げました。最初の2つはエディターです。
「プログラミング(正規表現を扱う力も含めて)が苦手で、今後もプログラミング力向上の努力をするつもりはない」という人の場合であっても引き出しはゼロじゃないので、自分がどんな引き出しを持っているのか把握することが出来ていれば、自分にとって一番効率よくテキストを変換できるでしょうね。
「現状の自分が出来る事よりさらに効率を上げたい」と言うことであれば、自分の力を上げるしか無い(or人に頼む)。「プログラミング力の向上は難しいが、正規表現の勉強くらいはしよう」と思うのならすれば良い。あと、エディターが使いこなせている実感が無ければ、エディターを使いこなせるようになるとかも。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#22
総合スコア13692
投稿2023/07/12 11:40
「プログラミングに落とし込むか否か」「その閾値はどこか」という基準は、人それぞれでいいんじゃないでしょうか。
はい、そう思います。その点、#16 は方向性を限定し過ぎではないかと感じたのでああいうコメントをつけましたが、ちょっとこれはこれで表現が強すぎたかもしれません。
あと、
「使い捨て」前提なので
という感じの作業をすることは私もよくあります。ところが、使い捨てのはずがそういかなくなる事が結構あるのですよね。
クレバーな人ならそんなことが起こらないように最初から完璧な手順を確立してしまえるのかもしれませんが、私はそうは行きません。あとから追加依頼が入って同じようなことを繰り返すことになったり、あるいは結果に疑問符がついて、遡って作業をチェックしたり修正したり。
最初の作業の何週間かあとになってそういう事態になることもあります。
そういうとき、最初になにやったか記録してあとで見返せるようにしておくことは大切で、それには日本語のメモなんか作るよりも、ワンライナーをスクリプト化しておくのが確実に思えます。私はgrepとsortをパイプで繋いだだけみたいな処理でも230712a.shみたいなスクリプトにして保存するようにしています。
そういうこともあって#19 のようなことを書きました。私のスタイルを押し付けるつもりはありませんが、スレ主氏がもし「プログラム」を除外視しているようなら、もう一度考えてみてほしいとは思っています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#24
総合スコア1453
投稿2023/08/12 15:20
簡単なものなら正規表現とか使わずにエディタ (VsCode)で「ファイル内の同じ文字を選んでから複数箇所を同時編集」で作業してしまう事が多いです
(文字を選んでCtrl+D または Command+D)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#25
総合スコア203
投稿2023/08/19 15:08
私もプログラムをちょろっと書くのが苦手派です。
数百程度ならvscodeのマルチカーソルと同じ文字を選択する機能を使って書き換えます。
ショートカットはカスタマイスしているかもしれませんが
shift + alt + ↓ で複数行のカーソル選択
文字選択中に ctrl + D で同じ文字を複数選択
ctrl +shift + → で単語選択
ctrl + → 文節移動
等を駆使して一気に書き換えます。
詳しくは以下の様に検索していただけますと。
google検索
vscode マルチカーソル 一括編集
https://www.google.co.jp/search?q=vscode+%E3%83%9E%E3%83%AB%E3%83%81%E3%82%AB%E3%83%BC%E3%82%BD%E3%83%AB+%E4%B8%80%E6%8B%AC%E7%B7%A8%E9%9B%86
まさにちょっとしたダミーデータの配列をjsonを書き換える時なんかによくやってます。
でもちょいちょい使うなら、皆さんの回答にある様に使い捨ての簡単なプログラムを取っておくのもよさそうですね。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。