プロが教える店舗&オフィスのセキュリティ対策術

入力ファイルであるCSVが可変長の場合の検索方法について教えて下さい。

以下、入力ファイル例
※項目数としては10項目以上あります。
aaa,12345,b,01,c
bbb,,c,02,d
ccc,76543,d,,e
ddd,,,04,f

上記入力ファイルを読込み、例えば2項目目と4項目目が未入力が否かをチェックするロジックを作成したい場合、実現する為にはどうすれば良いでしょうか?
多分FOR文でTOKENSを使用しても可変の為、うまく該当項目が取得できないと思ってます。
それを回避できるやり方を教えて頂きたく投稿してます。
どなたか回答の方よろしくお願いします。

質問者からの補足コメント

  • tatsu99さん
    早速の回答ありがとうございます。
    実際の作成は明日からですが、事前に情報収集しとおきたいです。

    すいませんが、追加で質問させて下さい。
    1.回答にあるスクリプトとはVbScriptの事でしょうか?
    もしそうであればこの処理はスクリプトでしかできないという事でしょうか?
    スクリプトの経験無しなもので@
    バッチファイルのコマンドプロンプトでは出来ない感じでしょうか?
    2.処理の中で配列を1と3に限定している意味がちょっと理解できてません。
    3.例えば3項目目も未入力チェック追加となった場合、教えて頂いているロジックで、入力ファイルの4レコード目は2項目目、3項目目が未入力となるでしょうか?

    へんな質問しているかもしれませんが、よろしくお願いします。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/06/26 22:24

A 回答 (4件)

内容から推測するとWindowsのバッチコマンドを使用してのご質問だと思います。


perlカテゴリではなく、その他(プログラミング)カテゴリで言語を明記して質問された方が良いですよ。

閑話休題

ご依頼の内容は以下で実現できます。
※データの無い列を検出するために「@」を挿入していますが、実際は「!」以外のCSVファイルで使用していない文字を選択してください。
※段付け表示の為、行頭に全角スペースを入れています。
-----------------------
@echo off

setlocal ENABLEDELAYEDEXPANSION

set CSV=sample.csv

for /F %%A in (%CSV%) do (
  set LINE=%%A

  rem カンマの前に@を挿入(CSV内で未使用の文字を使用すること)
  set LINEA=!LINE:,=@,!

  rem 2列目を%%Bに、4列目を%%Cに取得
  for /F "delims=, tokens=2,4" %%B in ("!LINEA!") do (
    if %%B==@ (
      echo 2列目データ無の行 !LINE!
    )
    if %%C==@ (
      echo 4列目データ無の行 !LINE!
    )
  )
)
    • good
    • 0
この回答へのお礼

助かりました

siffon99さん

質問のカテゴリを間違っているのにも関わらず対応頂きありがとうございます。
教えて頂いた内容で実行し意とした結果が得られました。
また何かありましたらよろしくお願いします。

お礼日時:2016/06/28 17:04

>2.処理の中で配列を1と3に限定している意味がちょっと理解できてません。


>3.例えば3項目目も未入力チェック追加となった場合、教えて頂いているロジックで、入力ファイルの4レコード目は2項目目、3項目目が未入力となるでしょうか?

言語がperlでないかも知れませんので回答しませんでしたが、一応言語がperlであるという前提で回答しておきますね。
処理の中で配列を1と3に限定しているのは、
$elm[1]が第2項目のデータだからです。
同様に、$elm[3]が第4項目のデータだからです。

例えば3項目目も未入力チェック追加となった場合は、$elm[2]が第3項目のデータなので
これが、空のデータ(未入力)かを判定する記述を追加します。
つまり
if ($elm[2] eq ""){
空の時の処理を書く。
}else{
空でない時の処理を書く。
}
となります。
    • good
    • 0
この回答へのお礼

解決しました

tatsu99さん

私の方が質問カテゴリを間違っていたみたいで余計な時間を取らせてしまいました。
色々とご回答頂きありがとうございました。

お礼日時:2016/06/28 17:09

perlのスクリプト(perlで書いたプログラムのこと)です。


カテゴリがperlなので、perlかと思っていましたが、
もしかして、言語はperlではないのでしょうか?
    • good
    • 0

1行ずつ読込、1行をカンマで分割し配列に格納します。


2項目の内容は配列名[1]に格納されます。
4項目の内容は配列名[3]に格納されます。
未入力の項目は、""となります。
以下のスクリプトを参考にして下さい。
スクリプト名は、sample.plとします。
-----------------------------------------
$lno = 0;
while(<>){
$lno++;
chomp $_;
@elm = split(/,/,$_);
if (scalar(@elm) < 4){
print "$lno 行 項目数不足\n";
next;
}
if ($elm[1] eq ""){
print "$lno 行 2項目が未入力です\n";
}else{
print "$lno 行 2項目=$elm[1]\n";
}
if ($elm[3] eq ""){
print "$lno 行 4項目が未入力です\n";
}else{
print "$lno 行 4項目=$elm[3]\n";
}
}
-----------------------------------------------------
aaa,12345,b,01,c
bbb,,c,02,d
ccc,76543,d,,e
ddd,,,04,f
上記のデータが data.csvに格納されているとします。

コマンドラインで
perl sample.pl data.csv
と入力してください。
実行結果は以下のようになります。
---------------------------------
1 行 2項目=12345
1 行 4項目=01
2 行 2項目が未入力です
2 行 4項目=02
3 行 2項目=76543
3 行 4項目が未入力です
4 行 2項目が未入力です
4 行 4項目=04
---------------------------------
不明点があれば、補足してください。
この回答への補足あり
    • good
    • 0
この回答へのお礼

tatsu99さん

丁寧なご回答ありがとうございます。
色々勉強になります。

お礼日時:2016/06/27 21:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!