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

csvといっても、行ごとに文字が入っています。
各行の文字が含まれるものがあればその行の内容を保存or表示
無ければ無視して次の行にといった具合にしたいのです。
(多数件数あるため、表示というよりは書き出しのほうが助かります)

http://www1.u-netsurf.ne.jp/~tomo_c/tips/R23Lev0 …
に書いているものを応用すればできそうな気もするのですが、
具体的にどういじっていいのかわからず、苦戦しています。

お分かりになられる方いらっしゃいましたら、ご教授願います。

A 回答 (2件)

こんなでどうだろう?



Sub LinePicUP()
  Dim iCnt As Long
  Dim FileA As String
  Dim FileB As String
  Dim FileC As String
  Dim A_LineData
  Dim B_LineData
  Dim FileNO1 As Long
  Dim FileNO2 As Long
  Dim FileNO3 As Long
  
  FileA = "C:\Filea.csv" '10マソ
  FileB = "C:\FileB.txt" '比較データ
  FileC = "C:\FileC.csv" '出力ファイル
  
  FileNO2 = FreeFile
  B_LineData = Space(FileLen(FileB)) 'メモリ確保の呪い
  Open FileB For Binary As #FileNO2
    Get #FileNO2, , B_LineData   '一括取得(使う時分割)
  Close #FileNO2
  
  FileNO1 = FreeFile
  Open FileA For Input As #FileNO1
    Do Until EOF(FileNO1) '10マソ
      Line Input #FileNO1, A_LineData
      For iCnt = 0 To UBound(Split(B_LineData, vbCrLf))
'        If A_LineData Like "*" & Split(B_LineData, vbCrLf)(iCnt) & "*" Then 'Like Ver
        If InStr(A_LineData, Split(B_LineData, vbCrLf)(iCnt)) > 0 Then     'InStr Ver
          FileNO3 = FreeFile
          Open FileC For Append As #FileNO3 '追加モードで開く(ファイルがない時は作るになるから、無問題)
            Print #FileNO3, A_LineData     'ファイルへ書き込む
          Close #FileNO3
          Exit For
        End If
      Next iCnt
    Loop
  Close #FileNO1
End Sub

エクセルの標準モジュールにコピペ
10万データがFileA
比較データがFileB
出力ファイルがFileC
全部C:\にある前提
まぁStringだから、その辺は適当に調整して下さい

FileBは配列にして利用
FileAをそうしないのは、メモリの問題でデカ過ぎて、多分かえって遅くなる

ここ2サイトは、お世話になりすぎて俺はお金払わなきゃならない
http://officetanaka.net/excel/vba/file/file08.htm
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …


全く検証してないから無保証で(笑)
追加返答はします
    • good
    • 0
この回答へのお礼

Dim B_LineDataをAs String指定するだけでちゃんと動きました。
わざわざご丁寧にありがとうございます。
まだまだvbscriptやバッチなど知識不足で質問何度かすることがあると思いますが、見つけたら答えてやっていただけると助かります。

お礼日時:2008/07/16 09:56

>csvといっても、行ごとに文字が入っています。


>各行の文字が含まれるものがあればその行の内容を保存or表示
行毎に文字が入っているとは?1列と言う事?
各行の文字が含まれるとは?何が含まれる場合? それは1つ?or複数?
書き出す場合もcsv?txtでもいいの?

検索する文字の行数によりますが、Excelに取り込んでフィルタオプション
とかでは、ダメなのでしょうか?(Excelがあればの話ですが)

この回答への補足

わかりにくく申し訳ございません。
10万行越えしているcsvファイル(以下:ファイルA)の中から、
400行程度のテキストファイル(以下:ファイルB)にある各行の文字列を検索したいです。

ファイルBの各行は、1単語(ユーザ名)しか書かれていないので、csvというよりはただのテキストファイルです。
ファイルA(ログファイル)にファイルBのユーザ名が記載されていない場合もあります。(この場合は無視してOKです)
ファイルAにファイルBのユーザ名が含まれる場合は、含まれている行を全て書き出し(ファイルに保存し)たいです。この場合、ファイルA内の該当行を書き出すごとに改行するだけでかまいません。
ファイルAがcsvでできているだけで、カンマごとにユーザ名を判別させる必要まではありません。

Excelで出来ればとも思いますが、行数が膨大なので分割する手間も考えると良いとは考えられません。
vbscriptで時間かかってでも放置していれば終わるのであれば効率良いと考えます。

補足日時:2008/07/14 11:07
    • good
    • 0

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