
perlで、外部のCSVファイル(01_01.csv)を読み込み、「先頭の9行」とその行以降の「先頭9文字」を削除したものを
[01_01_out.csv]として保存したいのですがどのようにしたらいいのでしょうか。
ご回答、よろしくお願い致します。
例)
読込ファイル:01_01.csv
----------------------------------------
AAA
BBB
CCC
DDD
EEE
FFF
GGG
HHH
00:00:00,1
00:01:00,2
00:02:00,3
00:03:00,4
00:04:00,5
00:05:00,6
(略)
10:00:00,101
10:01:00,102
10:02:00,103
10:03:00,104
10:04:00,105
10:05:00,106
----------------------------------------
出力ファイル:01_01_out.csv
----------------------------------------
1
2
3
4
5
6
(略)
101
102
103
104
105
106
----------------------------------------
A 回答 (4件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
回答2さんの手法でOKだと思いますが、もっと基礎的で泥臭い手法を説明すると。
。。#まずは01_01.CSVの各行を配列 @lines に格納します。
open (FH,"01_01.csv");
@lines = <FH>;
close(FH);
#次に foreachループを使って、@lines から1要素ずつ読んであげます。
#つまり、CSVファイルを1行読んで、その値を変数 $line に代入します。
#ただし先頭の9行は不要なので、変数 i が9以下であれば次のループへ飛ばします(nextの部分)。
#split 関数は文字列を分解するときに使うもので、今回はCSVファイルなので、
#区切り文字にカンマ( /\,/ の部分)を指定しています。
#split関数の左辺は、分割して得られた値となります。
#CSVファイルの10行目であれば、$first が 00:00:00 で、 $second が 1 となります。
#pushは配列に要素を追加するときに使う関数なので、foreachが回るたびに要素が追加されていきます。
#今回はカンマで区切られた2番目の値を得たいので、$second を配列要素として @optput に追加します。
$i = 1;
foreach $line (@lines) {
if ($i <= 9) {
$i++;
next;
}
($first,$second) = split(/\,/,$line);
push(@output,"$second\n");
}
これで 配列 @output に 10行目以下のカンマで区切られた2番目の値が改行付きで入りましたので、
あとは別のファイルに書き出すだけです。
open (FH,">01.csv");
print FH @output;
close(FH);
以上がCSVファイルを分解するときの基本です。
あとは、値が二重引用符で囲われていた場合にどうするか等、上記の手法を応用させるだけです。
※ 12345,"あいう,000",ABC (応用パターンの一例CSV)
No.3
- 回答日時:
もし、Perlでなくて良いなら、tailとcutを使って、
tail -n +10 CSV_FILE | cut -d, -f2-
10 は 9+1 で10行目から表示せよの意味、
2- は , を区切りにした2カラム目以降表示せよの意味。
こういうやり方もありますよという事で。
No.2
- 回答日時:
>例文が間違っていました。
。。#!/usr/bin/perl
use strict;
open (IN,"01_01.csv");
open (OUT,">01.csv");
while(<IN>){
if ( /\d+,(\d+)$/ ){
print OUT "$1\n";
}
}
close IN;
close OUT;
No.1
- 回答日時:
というより
#!/usr/bin/perl
use strict;
open (IN,"01_01.csv");
open (OUT,">01.csv");
while(<IN>){
if ( /,(\d+)$/ ){
print OUT "$1\n";
}
}
close IN;
close OUT;
この回答への補足
すみません。
例文が間違っていました。。。
下記が読み込むファイルとなっています。。。
読込ファイル:01_01.csv
----------------------------------------
AAA,10
BBB,10
CCC,ZZZ
DDD,ZZZ
EEE,10
FFF,10
GGG,10
HHH,10
00:00:00,1
00:01:00,2
00:02:00,3
00:03:00,4
00:04:00,5
00:05:00,6
(略)
10:00:00,101
10:01:00,102
10:02:00,103
10:03:00,104
10:04:00,105
10:05:00,106
----------------------------------------
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlでcsvファイルを読む(ダブ...
-
郵便番号辞書のアップデート手...
-
Perlで特定行から特定行までを...
-
ディレクトリ名を取得したい
-
MATLAB グローバル変数の宣言
-
ReadLineでの読み出し行を指定する
-
awkスクリプトでダブルクォーテ...
-
cookieを必要とするページへのLWP
-
バッチファイルの作り方(CSV→...
-
ExcelをCSV書き出す場合のシー...
-
fgets で値が取得できない
-
Windowsで複数のファイルを同じ...
-
VBAでCSVファイルを途中行まで...
-
エクセルVBA コードが同じでも...
-
【エラー】Unrecognized character
-
C言語で特定の行を抽出する方法...
-
vba dir の相対パス
-
readdir()で得られるファイル・...
-
パスから最後のディレクトリだ...
-
ADOによるCSVファイルからのデ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perlでcsvファイルを読む(ダブ...
-
Perlで特定行から特定行までを...
-
CSVファイルのデータの行数を取...
-
Perlを利用してテキストフ...
-
Perlの初心者です。2重ループ...
-
ディレクトリ内のtxtファイル中...
-
MATLAB std::exceptionエラー
-
Argument "\\\\n" isn't numeri...
-
パターンマッチングにおいて変...
-
郵便番号辞書のアップデート手...
-
Perlで空白行を削除
-
Perl 順位の重複
-
エクセルVBA コードが同じでも...
-
Windowsで複数のファイルを同じ...
-
batファイルでrenameができませ...
-
C言語で特定の行を抽出する方法...
-
VBAでCSVファイルを途中行まで...
-
MATLAB グローバル変数の宣言
-
パスから最後のディレクトリだ...
-
vba dir の相対パス
おすすめ情報