- ベストアンサー
指定行抽出
ファイルシステム使用率 / 収集日 収集時刻 ファイルシステム使用率 2008/9/1 0:04:44 値 2008/9/1 0:09:44 値 中略 2008/9/30 23:50:32 値 2008/9/30 23:55:31 値 ファイルシステム使用率 /boot 収集日 収集時刻 ファイルシステム使用率 2008/9/1 0:04:44 値 2008/9/1 0:09:44 値 中略 2008/9/30 23:50:32 値 2008/9/30 23:55:31 値 ファイルシステム使用率 /data 収集日 収集時刻 ファイルシステム使用率 2008/9/1 0:04:44 値 2008/9/1 0:09:44 値 とつながってしまっているcsv形式のデータを/、/boot、/dataと ファイル形式ごとに別シートに分割して抽出したいのですが、 方法をご教示願います。1ファイル4万行程ありますので 自動化したいと思っております。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
LINE INPUT #1, ss if InStr( ss, "ファイルシステム使用率" )> 0 then if InStr( ss, "/boot" )> 0 then を LINE INPUT #1, ss if InStr( ss, "ファイルシステム使用率 " )> 0 then if InStr( ss, "/boot" )> 0 then のように変更してみてください InStr( ss, "ファイルシステム使用率 " )の『ファイルシステム使用率』の後ろにスペースを1個追加します if InStr( ss, "/boot" )> 0 then sName = "boot.csv" else if InStr( ss, "/data" ) > 0then sName = "data.csv" else InStr( ss, "/" ) > 0 then sName = "org.csv" else MsgBox "データが異常です" Close Exit Sub end if を if InStr( ss, "/" )> 0 then sName = Mid$(ss,InStr( ss,"/")+1) else MsgBox "データが異常です" Close Exit Sub end if ' /のみの場合 if sName = "" then sName = "root" end if sName = sName & ".csv" といった具合にしてください これで元のファイルを 各項目のcsvファイルに分割できます
その他の回答 (3)
- hotosys
- ベストアンサー率67% (97/143)
ファイルがC:\test.csvだった場合です。 「csv形式のデータ」と質問にありますがサンプルデータは半角空白区切りなので半空白で分割します。 Sub sample() Dim readBuf As String Dim sheetBuf() As String '全テキスト読み込み With CreateObject("Scripting.FileSystemObject") With .GetFile("C:\test.csv").OpenAsTextStream readBuf = .ReadAll .Close End With End With '"ファイルシステム使用率 /"の前に削除マークを挿入(とりあえずchr(0)) readBuf = Replace(readBuf, "ファイルシステム使用率 /", Chr(0) & "ファイルシステム使用率 /") '"/"だけのものは"/root"に readBuf = Replace(readBuf, "/" & vbCrLf, "/root" & vbCrLf) 'chr(0)で分割 sheetBuf = Split(readBuf, Chr(0)) 'シートに書き込み(readBufの最初は削除マークなのでsheetBuf(0)は""になるため1から) 'これ以降はシートを追加するのかどうか、既にシートがあったらどうするのかで若干変更が必要 '今はシートが無いとしてシートを追加している Dim i As Integer Dim r As Integer Dim rowBuf() As String Dim cellBuf() As String For i = 1 To UBound(sheetBuf) rowBuf = Split(sheetBuf(i), vbCrLf) With Sheets.Add(after:=Sheets(Sheets.Count)) .Name = Replace(rowBuf(0), "ファイルシステム使用率 /", "") For r = 1 To UBound(rowBuf) cellBuf = Split(rowBuf(r), " ") 'カンマ区切りなら" "を","に変更 If UBound(cellBuf) >= 0 Then .Cells(r, 1).Resize(1, UBound(cellBuf) + 1) = cellBuf End If Next End With Next End Sub
- imogasi
- ベストアンサー率27% (4737/17070)
質問の次の意味が不明。 >ファイルシステム使用率 /やファイルシステム使用率 /boot ・・のレコードは40000レコードの中に何度も現れるのですか。 (日ごと現れる?) ーーーー ロジックは、CSVファイルについて 1レコードを読む 「ファイルシステム使用率」、レコードか(先頭からの文字列を見る) その場合/を探して、その次からをシート名とする ー収集日 収集時刻 ファイルシステム使用率の行は捨てる(見出し行に相当?)。 ーどちらでもなければデータ行として ースペースでSplitし、A,B,C列にデータをセット x=Split(data," ") Cells(i,"A")=x(0) -その際シートごとに次のデータを書き込む行ポインタをシート数だけ用意する(ファイルシステム使用率 / などが何度も現れるときは特に。毎回書き込むシートの最終行を探してもよいが) 以上難しい点は何も無い。 ーー シート名からシートを探すのは For Each Ws in Worksheets if Ws.Name="割り出したシート名" then Ws.cells(i,"A")=X(0) End IF Next のような泥臭い方法でとりあえずの方法として使って、シートをみつければ。
- redfox63
- ベストアンサー率71% (1325/1856)
その元ファイルを1行ごとに読み込み判断して出力ファイルを選定すればいいのでは Open "現在のファイル" for input as #1 do while not eof( 1 ) LINE INPUT #1, ss if InStr( ss, "ファイルシステム使用率" )> 0 then if InStr( ss, "/boot" )> 0 then sName = "boot.csv" else if InStr( ss, "/data" ) > 0then sName = "data.csv" else InStr( ss, "/" ) > 0 then sName = "org.csv" else MsgBox "データが異常です" Close Exit Sub end if Close fno fno = FreeFile Open sName For Append As fno else Print #fno, ss end if loop Close といった具合でしょう
お礼
貴重なご意見ありがとうございました。 ですが、知識がないのでうまく動きません。 教えていただいた考え方を元に、粘ってみます。
お礼
回答有難うございます。 質問が言葉不足でした。 抽出したいデータは1か月分のデータで その中に "ファイルシステム使用率 /"や"ファイルシステム使用率 /boot" は一回存在するだけです。 ですが、"ファイルシステム使用率 /"に対して 1日から30日or31日が5分毎 その次に、"ファイルシステム使用率 /boot"に対して 1日から30日or31日が5分毎といったように 存在するファイルシステムに対して延々と続くので フィルタもかけられず困っているのです。 先に頂いた回答の「行の頭から読み込ませる」というやり方で 何とかがんばってみようと思っているのですが、 私にとっては難しいという有様です。