入力ファイルであるCSVが可変長の場合の検索方法について教えて下さい。
以下、入力ファイル例
※項目数としては10項目以上あります。
aaa,12345,b,01,c
bbb,,c,02,d
ccc,76543,d,,e
ddd,,,04,f
上記入力ファイルを読込み、例えば2項目目と4項目目が未入力が否かをチェックするロジックを作成したい場合、実現する為にはどうすれば良いでしょうか?
多分FOR文でTOKENSを使用しても可変の為、うまく該当項目が取得できないと思ってます。
それを回避できるやり方を教えて頂きたく投稿してます。
どなたか回答の方よろしくお願いします。
No.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!
)
)
)
siffon99さん
質問のカテゴリを間違っているのにも関わらず対応頂きありがとうございます。
教えて頂いた内容で実行し意とした結果が得られました。
また何かありましたらよろしくお願いします。
No.3
- 回答日時:
>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{
空でない時の処理を書く。
}
となります。
tatsu99さん
私の方が質問カテゴリを間違っていたみたいで余計な時間を取らせてしまいました。
色々とご回答頂きありがとうございました。
No.2
- 回答日時:
perlのスクリプト(perlで書いたプログラムのこと)です。
カテゴリがperlなので、perlかと思っていましたが、
もしかして、言語はperlではないのでしょうか?
No.1
- 回答日時:
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
---------------------------------
不明点があれば、補足してください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Visual Basic(VBA) 顧客ごとに違う点検案内を作成するマクロ 4 2022/09/16 05:34
- その他(Microsoft Office) Wordを変換してExcelに挿入 2 2022/07/04 23:59
- Excel(エクセル) 列を自動で追加したい 3 2022/07/11 12:58
- ライフスタイル・ヘルスケア URLを開くアプリが見つかりません 2 2022/09/16 12:09
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Excel(エクセル) Excel リンク先のエクセルファイルの削除 同時に行を削除したい 1 2022/11/29 16:20
- その他(データベース) Excel VBA 転記について 1 2022/04/20 16:55
- Visual Basic(VBA) tatsumaru77様 昨日回答して頂いたものです。 すみませんが、昨日の質問で1つ補足があります 1 2022/05/15 15:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでCSVファイルの特定行を書...
-
ReadLineでの読み出し行を指定する
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルを途中行まで...
-
エクセルVBA コードが同じでも...
-
openした後、closeしないでプロ...
-
ADOによるCSVファイルからのデ...
-
拡張子 ”log” と ” dat” の違い
-
perlにて2つのファイル比較
-
MATLAB グローバル変数の宣言
-
VB6.0でDB接続する際に切断時の...
-
アクセスカウンターでデータが...
-
window.open でのファイル指定方法
-
awkスクリプトでダブルクォーテ...
-
htaccessで特定のディレクトリ...
-
fopenでディレクトリ内の全ファ...
-
ファイル出力の改行コードをLFに
-
エクセルVBAで素数だけを出力す...
-
fgets で値が取得できない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAでCSVファイルを途中行まで...
-
VBAで巨大なファイルの途中から...
-
ExcelをCSV書き出す場合のシー...
-
VBAでCSVファイルの特定行を書...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
エクセルVBA コードが同じでも...
-
csvファイル改行コードの置換に...
-
Perlの変数に文字数制限(容量...
-
perlにて2つのファイル比較
-
C言語でのファイルのデータ更...
-
JavaでCSVファイルを高速に読む...
-
VB6.0でDB接続する際に切断時の...
-
MATLAB グローバル変数の宣言
-
alarmのタイムアウト後の処理で...
-
DBMとテキストファイルのどちら...
-
perlで、後ろの行を読んで、前...
-
拡張子 ”log” と ” dat” の違い
-
5行おきに5行ずつ抽出するに...
-
テキストデータから指定した1...
おすすめ情報
tatsu99さん
早速の回答ありがとうございます。
実際の作成は明日からですが、事前に情報収集しとおきたいです。
すいませんが、追加で質問させて下さい。
1.回答にあるスクリプトとはVbScriptの事でしょうか?
もしそうであればこの処理はスクリプトでしかできないという事でしょうか?
スクリプトの経験無しなもので@
バッチファイルのコマンドプロンプトでは出来ない感じでしょうか?
2.処理の中で配列を1と3に限定している意味がちょっと理解できてません。
3.例えば3項目目も未入力チェック追加となった場合、教えて頂いているロジックで、入力ファイルの4レコード目は2項目目、3項目目が未入力となるでしょうか?
へんな質問しているかもしれませんが、よろしくお願いします。