ここから本文です

VBScriptで、CSVファイルから特定の文字列が入った行を取り出しさらにその中から特...

アバター

ID非公開さん

2020/5/2923:54:08

VBScriptで、CSVファイルから特定の文字列が入った行を取り出しさらにその中から特定のカラムの値を抽出する方法


・抽出対象
1万行単位の複数のCSVファイル

・やりたいこと
①特定の文字列(ABC)の入った行を抽出
※指定したい文字列は固定値
②抽出した行の特定のカラム(3列目、5列目、10列目)

別の方の質問を参考にして特定のカラム抽出はできたのですがそもそもの行の抽出および連携ができていません。
どなたかアドバイスを頂けないでしょうか。今回初めて触った超初心者です。
よろしくお願いいたします。

補足すみません追加になります。
現在以下の状態でここに①特定の文字列(ABC)の入った行を抽出を追加したいと思っています。
よろしくお願いいたします。
ーーーーー
Option Explicit
Dim a, cr, cv, f, gf, n, so
Set so = CreateObject("Scripting.FileSystemObject")
Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))
For Each f In gf.Files
If LCase(so.GetExtensionName(f.Name)) = "csv" Then
n = so.GetBaseName(f.Name)
Set cv = so.OpenTextFile(gf & "\" & f.Name, 1)
Set cr = so.OpenTextFile(gf & "\" & n & "_af.csv", 2, True)
Do Until cv.AtEndOfStream
a = Split(cv.ReadLine, ",")
cr.WriteLine a(2) & "," & a(4) & "," & a(9)
Loop
cv.Close
cr.Close
Set cv = Nothing
Set cr = Nothing
End If
Next
Set gf = Nothing
Set so = Nothing
ーーーーー

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

違反報告

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

Prometheusさん

2020/5/3011:15:26

前回の回答者ですので、使い方は、前回と同じです。

3行目「Const m = "ABC"」で、検索文字列を設定しています。

なお、読み込んだ1行のどこに「ABC」が存在しても「存在!」としてしまいます。

次に、4行目の「c = Array(5, 10, 15)」が、抜き出す列を設定しています。

ここは、これから先、増えても(もちろん、減っても)、ここを変更するだけで、他の部分を変更する必要はありません。

Option Explicit
Dim a, c, cr, cv, f, gf, i, n, so, x
Const m = "ABC"
c = Array(5, 10, 15)
ReDim r(UBound(c))
Set so = CreateObject("Scripting.FileSystemObject")
Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))
For Each f In gf.Files
If LCase(so.GetExtensionName(f)) = "csv" Then
n = so.GetBaseName(f)
Set cv = so.OpenTextFile(f, 1)
Set cr = so.OpenTextFile(gf & "\" & n & "_af.csv", 2, True)
Do Until cv.AtEndOfStream
x = cv.ReadLine
If InStr(x, m) > 0 Then
a = Split(x, ",")
For i = 0 to UBound(c)
r(i) = a(c(i) - 1)
Next
cr.WriteLine Join(r, ",")
End If
Loop
cv.Close
cr.Close
Set cv = Nothing
Set cr = Nothing
End If
Next
Set gf = Nothing
Set so = Nothing
MsgBox("Finished!")

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

詳しく説明します。

  • アバター

    質問者

    ID非公開さん

    2020/5/3013:32:45

    完璧です。

    本当に助かりました。
    ご説明につきましてはまずは自身で勉強のためにも確認していこうと思っております。

    ありがとうございました。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

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

1〜1件/1件中

kin********さん

2020/5/3005:45:57

こんな感じでどうでしょうか。

Dim CSVPath, temp, SplitData, i

CSVPath = CSVファイルの有るフルパス
Open CSVPath For Input As #1
Do While Not EOF(1)
Line Input #1, temp
If InStr("ABC", temp) <> 0 Then
' "ABC"を含んだ行の処理を記述

SplitData = Split(temp, ",")
For i = 0 To UBound(SplitData)
' 各カラムの処理を記述
Next i
End If
DoEvents: Loop
Close #1

この質問につけられたタグ

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

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

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

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

閉じる

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

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

閉じる