質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

Q&A

3回答

3561閲覧

csvファイルを列毎に置換したい

GQ8crpki5n4Gu62

総合スコア6

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Cygwin

Cygwinは、Unixのような環境を、Windows上で構築させるコマンドラインインターフェースです。

AWK

AWKは、UNIX 上で開発されたプログラミング言語で、CSVファイルなどのテキストファイルの処理を目的にデザインされています。

0グッド

0クリップ

投稿2021/11/01 07:08

Excelにcsvのデータを張り付けし、VBAで列毎に置換していますが、行数と列数が多く時間がかかっているので他の方法に切り替えようと考えています。
Cygwinでawkコマンドを使用しましたが、全体文字列置換と列毎への複数回文字列置換の方法がわかりませんでした。ご教授いただけませんでしょうか。
環境はWindows10です。
*他に効率のいいやり方等があればawkでなくてもいいです。

■置換前(サンプルデータ)
['チョコレート (2500)', ' 3,010(20/10/27 10:00)'

■置換後(サンプルデータ)
チョコレート,2500,3010,2020/10/27,10:00

置換処理は、下記の通りでお願いします。
◆全体処理
・[ を削除
・’ を削除
・4桁以上の数字に含まれるカンマを削除
◆一列目
・ ( を , に置換
・) を削除
◆二列目
・(yy/mm/dd hh:ss) を ,yyyy/mm/dd,hh:ss に置換

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2021/11/02 09:12

効率が良いかどうかは判りませんが、perl でもよいですか?
GQ8crpki5n4Gu62

2021/11/03 04:41

情報提供していただけるのであればよろしくお願いいたします。
guest

回答3

0

とほほのAWK入門、特に正規表現あたりを読めば、簡単に作れます。

一行で書けますので、しっかり勉強して下さい。

投稿2021/11/01 11:13

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

入出力の文字コードは UTF-8(BOMなし)です。そのため、このスクリプトで処理した CSV ファイルを Excel で読み込むと問題が発生するでしょう。

replace.pl

perl

1#!/usr/bin/perl 2 3use strict; 4use warnings; 5use utf8; 6 7binmode STDIN, ":utf8"; 8binmode STDOUT, ":utf8"; 9 10## print chr(65279); # UTF-8 with BOM 11while (<>){ 12 chomp; 13 s/\d{1,3}(,\d{3})+/my $x=$&;$x=~s:,::g;$x/ge; 14 s/\s*[))[']\s*//g; 15 s/\s*[((]\s*/,/g; 16 print "$_\n"; 17}

sh

1$ echo "['チョコレート (2500)', ' 13,010(20/10/27 10:00)'" | ./replace.pl 2チョコレート,2500,13010,20/10/27 10:00

投稿2021/11/03 19:15

melian

総合スコア20655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GQ8crpki5n4Gu62

2021/11/04 07:59

Perlのコード提供ありがとうございます。 提示いただいたコードは、ファイル全体に対して置換する内容ではないでしょうか。 実際に処理を行おうとしているファイルの列数は50以上あり、全てをパターン化できない可能性があるため、列毎に置換したいです。
melian

2021/11/04 08:03

情報提供はしましたので後はご自身でお考えください。
GQ8crpki5n4Gu62

2021/11/04 10:58

情報提供ありがとうございます。
guest

0

残念ながら、ここではコード作成依頼は受け付けておりません。

まずはあなたなりにコードを書いてみましょう。
そのうえで、わからないことがあればそのコードとともに聞いていただければお答えできるかと思います

投稿2021/11/01 07:17

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GQ8crpki5n4Gu62

2021/11/02 09:09

回答ありがとうございます。 失礼しました。試した内容を記載します。 ターミナルで下記コマンドを実行しましたが記載内容が正しくないため、置換前のテキストが表示されました。 ■入力1  cat test.txt | awk 'BEGIN{FS=",";OFS="\t"}{gsub(/(^'\['\x27)(.+)( ()([:digit:]{4})())(\x27)/, "\1,\3", $1);print $1}' ■表示結果1  ['チョコレート (2500)' 下記コマンドで冒頭の「['」は、検索条件にヒットしていることを確認しました。 ■入力2  cat test.txt | awk 'BEGIN{FS=",";OFS="\t"}{gsub(/(^'\['\x27)/, "\0", $1);print $1}' ■表示結果2  チョコレート (2500)' 「チョコレート」という文字列に対して、どのような記載をすればいいかわかりませんでした。 ご教授お願いします。 また、列毎に対しての置換処理についても併せて教えていただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問