はじめまして、お世話になります。
内容はdata.csvを開いて$a1の値が、ban1の時に、
該当の一行を読み出して、カンマ区切りでわかれている順番に、
$a1 $a2 $a3という変数に代入して他のプログラム内で、利用できればと思いますが、
思うように値が取得できません。
下記、参考サイトなどを見ながら、
動作の部分をかいてみました。
まだ理解が浅く、見当はずれな指示があるかもしれませんが、
ご参照いただき具体的な、
ご指摘をいただければと思います。
よろしくお願いいたします。
my $dataFile = 'data.csv';
open FH,"<$dataFile" or error_msg("データファイルが開けません : $!");
flock(FH, LOCK_EX);
while(<FH>){
chomp();
my@dummy = split(/,/,$_);
if($a1 == $ban1)
{ $hoge = $_; last; }
chop $hoge;
($a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$a10,$a11) = split(/,/);
}
flock(FH, LOCK_NB);
close FH;
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
簡単ながら
# ファイルを全部読み取り
my @records;
my $dataFile = 'data.csv';
open FH, "<$dataFile" || die;
foreach(<FH>) {
chomp();
my @a = split /,/;
push @records, \@a;
}
close FH;
# 読み取った行を繰り返し
my $size = @records;
for (my $i = 0; $i < $size; $i++) {
if ($records[$i]->[0] eq 'ban1') {
my @a = @{$records[$i]};
&他のプログラムの処理(@a);
if ($i + 2 < $size) {
my $b = $records[$i+2]->[3];
&任意の行から読み取った値を処理($b);
}
}
}
No.3
- 回答日時:
質問でされたいことが明白でないのですが・・。
条件を後出しで追加しないで下さい。CSVの先頭にkeywordを含む行を見つけて配列@aに入れて、配列の要素を参照するのでしたら$a[0]でよい事は前回説明しました。
ところが補足では複数行になっています。複数行の場合は、配列の配列になりますから、
my(@A, @tmp);
while (<>) {
@tmp = ********** と配列に代入
push @A, [ @tmp ];
}
として、外から $A[2][3] になります。
このあたりは、基本的な処理になりますので、「プログラミングPerl」などの書籍を求められて、学ばれるほうが良いですよ。
Perlですから、様々な方法が取れます。--長所でもあり欠点
この回答への補足
ORUKA1951様
ご回答いただきありがとうございます。
条件につきましては申し訳ございませんでした。
複数行の場合、配列の配列に入れることが
必要だという事は大変参考になりました。
書籍を購入し勉強しようと思います。
未熟な私に助言をいただき、誠にありがとうございました。
下記の方法で値を取得することができました。
ただ、こちらの方法だと、項目が増えるのに従い、
追記の作業も増えそうなので、
もう少しスマートな方法で値を取得・代入できないものでしょうか?
よろしくお願いいたします。
open(IN,"data.csv") or die;
my @data=<IN>;
close(IN);
$num=@data;
foreach(@data) {($m1,$m2,$m3,$m4,$m5)=split(/,/,);
push(@data0,"$m1");
push(@data1,"$m2");
push(@data2,"$m3");
push(@data3,"$m4");
push(@data4,"$m5");
$mname1 = @data4[1];
$mname2 = @data4[2];
$mname3 = @data4[3];
chomp($mname1);
chomp($mname2);
chomp($mname3);
$mname1 =~ s/[\n\r]//g;
$mname2 =~ s/[\n\r]//g;
$mname3 =~ s/[\n\r]//g;
}
No.2
- 回答日時:
>下記、参考サイトなどを見ながら、
splitを使っているだけであまり参考にならないようですね。
if($a1 == $ban1){}
といきなり現れても$a1も、その値も未知
要は、行の先頭がban1の時に、各値を代入すればよい。
なお、csvはそれを作成したアプリケーション依存です。例えば各項の値に,が値として含まれていたときの処理などを加えなければなりません。(split(/,/,$_);は使えない)
excelの場合、値に,や"や改行が含まれている場合は値が""で括られます。
値にがある場合は""に置き換えられています。
それを取り出した後、,や""は再びもとの形に戻さなければなりません。
もう一点、値に改行が含まれていると困りますので
下記参考に! タブは に置換してあるので戻す。
my $check = 'ban1';
while (my $line = <FH>) {
$line .= <FH> while ($line =~ tr/"// % 2 and !eof(FH));
if($line =~ /^$check,/ ){
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
my @a = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
# $a[0]~ いくつでも参照できるのでそれを使う。
}
この回答への補足
ORUKA1951様
お世話になっております。
先ほどはご回答ありがとうございました。
my $check = 'ban1';での該当した行を取得していますが、
任意の行、たとえば3行目の4列目を取得することは可能なのでしょうか?
$a[2][3]で試しましたが、エラーが出てしましました。
何か追加すべき必要な処理がございましたら、
ご教授いただければありがたいです。
よろしくお願いいたします。
ORUKA1951様
ご回答いただきありがとうございます。
エクセルでのデータの扱いも、
処理の中に考慮する必要があるのですね。
とても勉強になりました。
ご教示いただいた内容で、試してみます。
ありがとうございました。
No.1
- 回答日時:
とりあえず
・「$a1」とは何か
・「該当の一行」とはどこか
・「他のプログラム」とは何か
が分からない.
配列じゃダメなの?
この回答への補足
Tacosan様
わかりにくい質問で申し訳ございませんでした。
質問内容の補足をいたします。
>・「$a1」とは何か
こちらは参照するcsvファイルの1行にある列のことです。
a1が1行目、1番の列の項目で、1行に列は11項目あります。
1行目の11項目を分割して、
a1から、$a11の変数に代入できればと思っています。
>・「該当の一行」とはどこか
こちらはif($a1 == $ban1)のことで、
1行目の一番目の項目が$ban1とマッチした行になります。
>・「他のプログラム」とは何か
csvファイルを開いた後に、
a1 b1 等の各行頭の値を、プルダウンフォームに入れてみようと思っています。
以上、よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Excel(エクセル) エクセルのA1~A5の任意のセルを選んだら1、A6~A10のセルなら2と返す設定にしたいと思ってます 6 2023/03/20 18:46
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- Excel(エクセル) Excel VBAプルダウンの値を変えながら2枚ずつ印刷する方法? 4 2022/05/27 13:04
- Visual Basic(VBA) VBAで出力したCSVファイルの先頭にカンマを挿入したい 5 2022/10/14 12:20
- Java Java 南京錠 2 2023/02/04 11:46
- Excel(エクセル) SUMIF関数について 4 2023/06/14 13:13
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
テキストファイルで提出とは?
-
perlのflock関数でロックをかけ...
-
bashスクリプト
-
perlをバージョンアップしたら...
-
perl 正規表現でエラー
-
perlで2次元配列をサブルーチ...
-
Perlで特定文字列から特定文字...
-
英数文字列のうちの数値を4桁に...
-
openした後、closeしないでプロ...
-
perlで自動ログインをしたいが...
-
Perlのエラーについてご教授く...
-
Strawberry Perl for Windows ...
-
arduino の割り込み処理について
-
アルファベットに付いて質問し...
-
AI sisterとは、偽物の人ですか?
-
ファイルアイコンの左下に緑の□...
-
perlでリテラル値はメモリにど...
-
Perlで時間の計算
-
perlについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
INDIRECT 横に再度抽出したい
-
openした後、closeしないでプロ...
-
perlをバージョンアップしたら...
-
Perl の外部モジュールの利用方法
-
Perlのエラーについてご教授く...
-
テキストファイルで提出とは?
-
bashスクリプト
-
Windows10においての『Perl』の...
-
perlのflock関数でロックをかけ...
-
Perlで特定文字列から特定文字...
-
perlプログラミング 空白行削除
-
画像が表示でnull; this.src
-
ターミナルで特定の文字と文字...
-
Wallpaper Engineでおすすめの...
-
perl 正規表現でエラー
-
perlで複数のファイルの処理に...
-
perlでリテラル値はメモリにど...
-
このファイルを開く方法で困っ...
-
LinuxにおいてのPerlのプログラ...
-
PerlでUTF-8のファイルの文字列...
おすすめ情報