ここから本文です

テキストファイルを分割するDOSバッチの書き方について。 下記のようにCSVファ...

fly********さん

2020/1/2422:34:38

テキストファイルを分割するDOSバッチの書き方について。

下記のようにCSVファイルをDOSバッチファイルで分割したいのですが、どのようにすれば良いでしょうか?
・指定した文字がある行よ

り1行前の行
・1行目と指定した文字がある行以降

以下、補足になります。

・検索する文字は毎回一緒ですが、分割させる行数が毎回変わります。
・検索する文字はテキストエディタ等で検索する場合、タブルコーテーション付「"メロン"」で検索すると1つしかありませんが、ただの「メロン」だと、複数該当します。
・途中完全な空白行はありません


■サンプル
テスト.csv:もともとのCSVファイル
テスト2.csv:指定した文字がある行より前の行を出力したファイル
テスト3.csv:1行目と指定した文字がある行以降を出力したファイル

テスト.txt------------
"ID","商品名","価格"
"100","りんご","150"
"99","みかん","90"
"97","ぶどう 2個","1000"
"96","メロン","1300 "
"95","ぶどう","500"
"94","メロン 2個","2500"
------------------------------
↓を
テスト2.txt------------
"ID","商品名","価格"
"100","りんご","150"
"99","みかん","90"
"97","ぶどう 2個","1000"
------------------------------

テスト3.txt------------
"ID","商品名","価格"
"96","メロン","1300 "
"95","ぶどう","500"
"94","メロン 2個","2500"
------------------------------
に分けるといった形です。

お分かりになる方がいましたら、お願いいたします。

閲覧数:
26
回答数:
2
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

uso8megaさん

2020/1/2507:52:32

バッチ単体では低性能過ぎるから、
私ならPowerShellで やるかなぁ。

$fnm=-split'テスト テスト2 テスト3';
$ext=".csv";#".txt";#
$txt=gc ($fnm[0]+$ext);
$ofn=1;
$txt|%{if($_ -match '"メロン"'){
    $ofn=2;
    ac ($fnm[$ofn]+$ext) $txt[0];
  }
  ac ($fnm[$ofn]+$ext) $_;
}

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

Prometheusさん

2020/1/2508:57:05

「VBScript」による回答ですので、ダメでしたら、無視してください。

このプログラムは、これから分割したい「csv」ファイルを、1つだけ、プログラムファイルにドラッグ&ドロップするだけです。

ドラッグ&ドロップした「csv」ファイルと同じフォルダ内に、「abc.csv」ファイルをドラッグ&ドロップした場合、「abc2.csv」、「abc3.csv」という、結果ファイルを作成し、最後に「Finished!」と表示しますので、「OK」を押して、終了してください。

なお、3行目の「w = "メロン"」で、検索文字列を指定していますが、もし、「メロン」が存在しなかった場合は、「abc3.csv」ファイルは、作成されず、メッセージを表示して、結果的に、「abc.csv」と同じ内容の「abc2.csv」ファイルが作成され、終了します。

以下のプログラムを、メモ帳かテキストエディタに貼り付け、「~.vbs」という名前で保存してください(保存する際は、必ず、「Shift-JIS(ANSI)」で保存してください)。

できたプログラムファイル(「~.vbs」ファイル)に、これから分割したい「csv」ファイルを、1つだけ、ドラッグ&ドロップするだけです。

Option Explicit
Dim c, cv, f, g, i, m(), n, so, w, wa
w = "メロン"
Set so = CreateObject("Scripting.FileSystemObject")
Set wa = WScript.Arguments
If wa.Count <> 1 or LCase(so.GetExtensionName(wa(0))) <> "csv" Then
MsgBox("ドラッグ&ドロップできるのは、csvファイル1つだけです")
WScript.Quit
End If
f = so.GetParentFolderName(wa(0))
n = so.GetBaseName(wa(0))
Set cv = so.OpenTextFile(wa(0), 1)
c = - 1
Do Until cv.AtEndOfStream
c = c + 1
ReDim Preserve m(c)
m(c) = cv.ReadLine
Loop
cv.Close
Set cv = Nothing
Set cv = so.OpenTextFile(f & "\" & n & "2.csv", 2, True)
g = - 1
For i = 0 to c
If InStr(m(i), w) > 0 Then
g = i
Exit For
End If
cv.WriteLine m(i)
Next
cv.Close
Set cv = Nothing
If g = - 1 Then
MsgBox(w & "は、見つかりませんでした。")
WScript.Quit
Else
Set cv = so.OpenTextFile(f & "\" & n & "3.csv", 2, True)
cv.WriteLine m(0)
For i = g to c
cv.WriteLine m(i)
Next
End If
Set wa = Nothing
Set so = Nothing
MsgBox("Finished!")

説明が、必要でしたら、言ってください。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる