以下のインプットファイル(csv)の行と列を入れ替えるスクリプトについて質問させてください。
ID,氏名,都道府県,開始日時,終了日時
0001,山田太郎,東京都,20180110,20180120
0001,山田太郎,東京都,20180310,20180330
0002,佐藤花子,埼玉県,20171110,20171112
0003,山本正,沖縄県,20160916,20160920
0003,山本正,沖縄県,20180421,20180422
0003,山本正,沖縄県,20170707,20170808
ID、氏名、都道府県の値が同じであれば、以下のように開始日時と終了日時の値を1行にしたいのですが、どうすればいいのかわかりません。どなたか教えていただけないでしょうか?
何卒よろしくお願いいたします。
アウトプットファイル(csv)
0001,山田太郎,東京都,20180110,20180310,20180120,20180330
0002,佐藤花子,埼玉県,20171110,20171112
0003,山本正,沖縄県,20160916,20180421,20170707,20160920,20180422,20170808
No.5ベストアンサー
- 回答日時:
>逆にアウトプットファイルをインプットファイルにして横に整列したものを再び縦に整列させるスクリプトを教えていただけないでしょうか?
以下のようになります。(sample2.plとします)
使用方法は、
perl sample2.pl アウトプットファイル
と入力すると、結果が画面に表示されます。
---------------------------------
$fname = $ARGV[0];
open FH,$fname or die "open error:$!";
while(<FH>){
chomp($_);
@elm = split(/,/,$_); #カンマで分割
$npair = int((scalar(@elm) - 3) / 2); #日付の組数を取得
$key = join(',',@elm[0..2]); #先頭の3個をカンマで連結
#日付の組数分繰り返す
for ($i = 0; $i < $npair; $i++){
#画面に出力する
print $key,",",$elm[3+2*$i],",",$elm[4+2*$i],"\n";
}
}
close FH;
-------------------------------------------
tatsu99さん、おかげさまで自分がやりたいことができました。ありがとうございました。また、スクリプトもわかりやすくコメントも付けていただき勉強になりました。
返事が遅くなりすいませんでした。
No.4
- 回答日時:
>今回インプットファイルを縦から横にまとめましたが、
>逆にアウトプットファイルをインプットファイルにして横に整列したものを再び縦に整列させるスクリプトを教えていただけないでしょうか?
以下の点、確認させてください。
確認1)元のインプットファイルを使えば、アウトプットファイルからインプットファイルを作り直す必要はないと思います。
わざわざ、元に戻すスクリプトを作る理由は何故でしょうか?
確認2)スクリプトで元に戻した場合、完全に元には戻りませんが、宜しいでしょうか。例えば以下のようになります。
元のインプットファイルが以下の場合、
0001,山田太郎,東京都,20180310,20180330
0001,山田太郎,東京都,20180110,20180120
0003,山本正,沖縄県,20160916,20160920
0002,佐藤花子,埼玉県,20171110,20171112
0003,山本正,沖縄県,20180421,20180422
0003,山本正,沖縄県,20170707,20170808
スクリプトで作り直したインプットファイル
0001,山田太郎,東京都,20180110,20180120
0001,山田太郎,東京都,20180310,20180330
0002,佐藤花子,埼玉県,20171110,20171112・・・・①
0003,山本正,沖縄県,20160916,20160920・・・・②
0003,山本正,沖縄県,20180421,20180422
0003,山本正,沖縄県,20170707,20170808
①②の箇所が元のファイルと違ってきます。
確認3)
スクリプトで作り直す場合、作り直したインプットファイルには、見出し行は出力しませんがそれでよろしいでしょうか?
No.3
- 回答日時:
No2です。
以下のスクリプトを作成します。(sample.plとします)
1行目が見出しなので、1行目はスキップします。
以下のコマンドを実行してください。
perl sample.pl インプットファイル名
結果が画面に表示されます。
ファイルに出力する場合はリダイレクトしてください。
perl sample.pl インプットファイル名 > アウトプットファイル名
とすると、アウトプットファイルに結果が出力されます。
--------------------------------------
$fname = $ARGV[0];
open FH,$fname or die "open error:$!";
%arr = ();
while(<FH>){
if ($. == 1) { next; } #1行目はスキップする
chomp($_);
@elm = split(/,/,$_,5); #カンマで分割
$key = join(',',@elm[0..2]); #先頭の3個をカンマで連結
$day = join(',',@elm[3..4]); #後の2個をカンマで連結
if (exists($arr{$key})){
#既存なら日付を連結
$arr{$key} = $arr{$key} . ',' . $day;
}else{
#新規なら日付を記憶
$arr{$key} = $day;
}
}
close FH;
#画面に出力する
foreach $key(sort(keys %arr)){
print $key,",",$arr{$key},"\n";
}
-----------------------------------
No.2
- 回答日時:
インプットファイルの1行目は、
見出し(ID,氏名,都道府県,開始日時,終了日時)でしょうか?
それとも
データ(0001,山田太郎,東京都,20180110,20180120 等)でしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 転職 長く続けられる好条件の求人でしょうか? 3 2023/07/12 18:45
- メディア・マスコミ 日本はなんで? 右寄り左寄りの地方紙があるんですか? 12 2023/06/21 07:59
- Excel(エクセル) エクセルの参照について教えてください 1 2022/12/08 16:06
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- ゴールデンウィーク・シルバーウィーク あなたの人生の県の数は? 3 2022/12/04 12:13
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- 世界情勢 沖縄の基地問題と経済について。 7 2022/05/09 13:51
- その他(国内) 3時!夜中なのか早朝なのか微妙な時間、5時に出るならシャワー浴びてお茶淹れて神棚、仏壇 2 2022/05/20 03:58
- 政治 岸田内閣は国民を代表しているでしょうか? 11 2022/05/08 05:56
- その他(地域情報・旅行・お出掛け) 海外旅行に行ったことがないのは今や珍しいですか? 12 2022/12/01 19:51
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
VBAでCSVファイルを途中行まで...
-
ExcelをCSV書き出す場合のシー...
-
JavaでCSVファイルを高速に読む...
-
ReadLineでの読み出し行を指定する
-
エクセルVBA コードが同じでも...
-
拡張子 ”log” と ” dat” の違い
-
MATLAB グローバル変数の宣言
-
perlで容量の大きいCSVファイル...
-
エクセルマクロについて CSVフ...
-
ADOによるCSVファイルからのデ...
-
Perlの変数に文字数制限(容量...
-
Perlの質問:行と列を入れ替え...
-
VB6.0でDB接続する際に切断時の...
-
csvファイル改行コードの置換に...
-
window.open でのファイル指定方法
-
パスから最後のディレクトリだ...
-
DOSコマンドで、標準出力を出力...
-
awkスクリプトでダブルクォーテ...
-
batファイルでrenameができませ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAでCSVファイルの特定行を書...
-
エクセルVBA コードが同じでも...
-
ExcelをCSV書き出す場合のシー...
-
openした後、closeしないでプロ...
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
VB6.0でDB接続する際に切断時の...
-
ReadLineでの読み出し行を指定する
-
VBAで巨大なファイルの途中から...
-
Perlの変数に文字数制限(容量...
-
エクセルマクロについて CSVフ...
-
MATLABでのwhile文の条件について
-
C言語でのファイルのデータ更...
-
C#でCSVファイルを逐一更新したい
-
CSVファイルの内容を編集する方...
-
VBScriptでファイル保存先のデ...
-
ADOによるCSVファイルからのデ...
-
2つのCSVファイルをマッチング
-
CSVが可変長の場合の検索方法
おすすめ情報
勘違いをして、「この質問は特に30代・男性の方にリクエストされています!」を選択してしまいました。どなたでも助けていただけると助かります。
インプットファイルの1行目は見出し(ID,氏名,都道府県,開始日時,終了日時)です。
何卒よろしくお願いします。
tatsu99さん、回答ありがとうございました。とても分かりやすいスクリプトで大変勉強になりました。おかげさまでやりたいことができました。
大変申し訳ないですが、これに関連した質問をさせてください。
今回インプットファイルを縦から横にまとめましたが、逆にアウトプットファイルをインプットファイルにして横に整列したものを再び縦に整列させるスクリプトを教えていただけないでしょうか?
ずっと考えていていくつか試してみたのですが、うまくいきません。
何卒よろしくお願いいたします。
返答ありがとうございます。確認点について回答させていただきます。
確認1について、不可思議なことをお願いしてすいません。実は仕事でいくつかのツールを使用するのですが、一つだけインプットデータの形式を横に並べた形式にしないといけない仕様になっており、アウトプットもインプットと同じ横に並んだ形式になっております。そのツールを使用後、そのアウトプットを使用し、ほかのツールを使用する予定で、その際のインプットデータの形式が縦に並んだ形式なもので、今回質問させていただきました。わかりにくくてすいません。
確認2について、はい、大丈夫です。レコード(行)の順番が違っても問題ありません。
確認3について、見出し行は必要ありません。
何卒よろしくお願いいたします。