質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

Q&A

解決済

3回答

38230閲覧

フォルダ内のCSVファイルをすべて読み込み、先頭7行削除、最後の行を削除したい

kumakumatan

総合スコア213

VBScript

VBScript(Visual Basic Scripting Edition)はMicrosftが開発したスクリプト言語であり、Visual Basicのサブセットです。

0グッド

0クリップ

投稿2016/01/21 06:31

編集2016/04/05 01:22

【1】あるフォルダ内にあるCSVファイルのみを全て読み込み
【2】読み込んだ全てのファイルの先頭7行を削除、最終行を削除して保存

するスクリプトをVBSで作成しています。

ファイル名は全て取り出せたのですが、ファイルの行数を取得する際に、一つのファイルを読んだら、
処理が終了してしまいました。

おそらく、Do While ~ の中の処理がうまくいってないと思われます。
できれば、先頭7行削除、最終行を削除して保存する方法も合わせてご教授願いたいと思います。

下記に自分で作成したプログラムを記述しますので、宜しくお願い致します。

vbscript

1'ファイルシステムオブジェクト定義 2Dim objFSO 3Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 4'カレントパス取得 5Dim objPath 6Set objPath = CreateObject("Scripting.FileSystemObject").GetFolder(".") 7 8 9For Each objFile In objPath.Files 10 11 Dim FileName 12 FileName = objFile.Name 13 'WScript.Echo FileName 14 15 If InStr(FileName, ".csv") > 0 Then 16 '文字列の中に".csv"の文字があればここの処理が行われます。 17 Call FileRead(FileName) 18 End If 19 20Next 21 22Sub FileRead(FileNameA) 23 24 Dim objFSO ' FileSystemObject 25 Dim objFile ' ファイル読み込み用 26 27 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 28 If Err.Number = 0 Then 29 Set objFile = objFSO.OpenTextFile(FileNameA) 30 If Err.Number = 0 Then 31 count = 0 32 Do While objFile.AtEndOfStream <> True 33 34 35 36 37 count = count + 1 38 If count < 8 Then 39 WScript.Echo FileNameA & objFile.ReadLine 40 End If 41 42 43 44 Loop 45 objFile.Close 46 Else 47 WScript.Echo "ファイルオープンエラー: " & Err.Description 48 End If 49Else 50 WScript.Echo "エラー: " & Err.Description 51End If 52 53Set objFile = Nothing 54Set objFSO = Nothing 55 56 'MsgBox "ファイル名:" & FileNameA 57 58 59End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

フォルダの作成はコメントアウトしてあるようですがCreateFolderでできませんでしたか?
もし同名フォルダが存在した場合にエラーとなっているのであれば、既存フォルダーの存在チェックをしてから作成すればいいと思います。

objFso.FolderExists(".\Edit")

ファイル出力に関しては、出力ファイル用にオブジェクトを作成し、ループ内で条件を満たす場合に書き込んであげればいいと思います。

'出力ファイルの作成 (出力ファイルが変わるたびに新規作成) Set objWriteFile = objFSO.CreateTextFile(strOutFilePath, true) '新規ファイル作成 (以下ループ処理内) strText = objFile.ReadLine If objFile.AtEndOfStream <> True And count > 8 Then objWriteFile.WriteLine(strText) '1行出力 End If

投稿2016/01/22 05:51

jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jawa

2016/01/22 06:24

解決済みでしたね、すみません。
kumakumatan

2016/01/22 06:51

ありがとうございます。 ご参考にさせていただきます。
guest

0

自己解決

質問しているうちに自分がやりたい処理が作成する事ができました。

======VBS=====
If MsgBox("先頭から7行と最後の行を削除する処理を実行します!" & _
vbCrLf & vbCrLf & _
"[OK]を選択した場合は処理が開始されます。" & _
"[キャンセル]を選択した場合は何も処理されません。", _
vbOKCancel + vbQuestion, "ファイル操作処理の確認") = vbOK Then

'MsgBox "ファイル操作処理が開始されました!", _ ' vbOKOnly + vbInformation, "ファイル操作処理開始"

'ファイルシステムオブジェクト定義
Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
'カレントパス取得
Dim objPath
Set objPath = CreateObject("Scripting.FileSystemObject").GetFolder(".")

Dim strFormattedDate '日付取得 Dim wkNow wkNow= Year(Now()) wkNow= wkNow & Right("0" & Month(Now()) , 2) wkNow= wkNow & Right("0" & Day(Now()) , 2) wkNow= wkNow & Right("0" & Hour(Now()) , 2) wkNow= wkNow & Right("0" & Minute(Now()) , 2) wkNow= wkNow & Right("0" & Second(Now()) , 2) strFormattedDate = wkNow

'"yyyymmddhhmmss_Edit" というフォルダを作成する

strFormattedDate = strFormattedDate & "_Edit" If objFSO.FolderExists(strFormattedDate) = True Then strMessage = "フォルダ " & strFormattedDate & " は既に存在しています。" Else objFSO.CreateFolder(strFormattedDate) strMessage = "フォルダ " & strFormattedDate & " を作成しました。" End If

' WScript.Echo strMessage

'CSVファイルの読み込み件数をカウント
For Each objFile In objPath.Files

Dim FileName FileName = objFile.Name If InStr(FileName, ".csv") > 0 Then '文字列の中に".csv"の文字があればここの処理が行われます。 FileCnt = FileCnt + 1 writeFile = strFormattedDate & "\" & FileName '作成ファイル指定 'WScript.Echo FileName Set fso = CreateObject("Scripting.FileSystemObject") Set fileIn = fso.OpenTextFile(FileName) count = 0 '読み込みRead件数 Do While fileIn.AtEndOfStream <> True count = count + 1 fileIn.Readline '読み込み命令 Loop fileIn.Close '読み込みファイル閉じる 'ファイル書き込み処理を呼び出し Call FileWrite(FileName,strFormattedDate,count,writeFile) End If

Next

WScript.Echo "読み込みファイル数" & FileCnt & "件"

Sub FileWrite(FileNameA,DateA,countA,writeFileA)

WScript.Echo FileNameA & countA & "行" 'WScript.Echo FileNameA & countB & "行" Set fso = CreateObject("Scripting.FileSystemObject") Set fileIn = fso.OpenTextFile(FileNameA) '読み込みファイル Set fileOut = fso.CreateTextFile(writeFileA) '書き込みファイル countB = 0 '書き込み件数 Do While Not fileIn.AtEndOfStream countB = countB + 1 '先頭と末尾の両方のスペースを削除した文字列を返す line = Trim(fileIn.ReadLine) If countB > 7 and countB < CountA Then '先頭7行、最終行の1行前までを書き込む条件 fileOut.Write line fileOut.WriteLine End If Loop 'fileOut.WriteLine '改行 fileIn.Close '読み込みファイル閉じる fileOut.Close '読み込みファイル閉じる

End Sub

End If '処理終了
========VBS終了======

今後とも宜しくお願いします。

投稿2016/01/22 05:10

kumakumatan

総合スコア213

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

FileRead関数の中で

VBScript

1If Err.Number = 0 Then 2 Set objFile = objFSO.OpenTextFile(FileNameA) 3If Err.Number = 0 Then

の最初のIf Err.Number = 0 ThenのEndifが見当たりませんが。

投稿2016/01/21 09:06

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2016/01/21 09:16

'ファイルシステムオブジェクト定義 Dim objFSO Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") 'カレントパス取得 Dim objPath Set objPath = CreateObject("Scripting.FileSystemObject").GetFolder(".") '"Edit" というフォルダを作成する 'str_path = objFSO.CreateFolder(".\Edit") For Each objFile In objPath.Files Dim FileName FileName = objFile.Name 'WScript.Echo FileName If InStr(FileName, ".csv") > 0 Then '文字列の中に".csv"の文字があればここの処理が行われます。 Call FileRead(FileName) End If Next Sub FileRead(FileNameA) Dim objFSO ' FileSystemObject Dim objFile ' ファイル読み込み用 Set objFSO = WScript.CreateObject("Scripting.FileSystemObject") If Err.Number = 0 Then Set objFile = objFSO.OpenTextFile(FileNameA) If Err.Number = 0 Then count = 0 Do While objFile.AtEndOfStream <> True count = count + 1 If count < 8 Then WScript.Echo FileNameA & objFile.ReadLine ELSE '次の処理へ Exit Do End If Loop objFile.Close Else WScript.Echo "ファイルオープンエラー: " & Err.Description End If Else WScript.Echo "エラー: " & Err.Description End If Set objFile = Nothing Set objFSO = Nothing 'MsgBox "ファイル名:" & FileNameA End Sub 作成し直して、1行目から7行目までの行内容を表示する事ができました。 やりたい事をするには以下の方法でするべきでしょうか? 【1】新しいフォルダを作成 【2】ファイルを読み込み、1行目~7行目、最後の行以外を新しいフォルダ内に    ファイルを作成して、書き込む。 読み込み処理と、書き込み処理は無ずかいしいでしょうか? 宜しくお願いします。
jawa

2016/01/22 01:37

>最初のIf Err.Number = 0 ThenのEndifが見当たりませんが。 段組みがずれていますが、最後の ``` Else WScript.Echo "エラー: " & Err.Description End If ``` が受けているようですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問