秀丸で開いて 置換で
\t を なしに (\tの後に半角空白(空白の数は とりあえず ひとつで なくなるまで 繰り返し実行する) (なし というのは 何も 入れない状態) 正規表現にチェックを入れて 置換では ダメですか?
複数ファイルの場合は、grepして置換というのを使えばいいでしょう。
▽2
●
kodairabase ●90ポイント ベストアンサー |
コメントいただいたように「データはタブ区切り」で作り直してみました。
お試しください。
Option Explicit '行を列に分離 Function splitRow2Col(sour As String) Dim i As Integer, ln As Integer, num As Integer Dim c As String, q As String, buf As String Dim items(1000, 1) As Variant ln = Len(sour) q = "" buf = "" num = 0 For i = 1 To ln c = Mid(sour, i, 1) '列区切り文字 If (c = vbTab Or c = ",") Then If (q = "*") Then q = "" ElseIf (q = "") Then items(num, 0) = buf items(num, 1) = q num = num + 1 buf = "" Else buf = buf & c End If 'シングルクォーテーション ElseIf (c = "'") Then If (q = "") Then q = "'" buf = "" 'クォーテーションの前の文字は無視 ElseIf (q = "'") Then If (i < ln) Then items(num, 0) = buf items(num, 1) = q num = num + 1 q = "*" buf = "" End If Else buf = buf & c End If 'ダブルクオーテーション ElseIf (c = """") Then If (q = "") Then q = """" buf = "" 'クォーテーションの前の文字は無視 ElseIf (q = """") Then If (i < ln) Then items(num, 0) = buf items(num, 1) = q num = num + 1 q = "*" buf = "" End If Else buf = buf & c End If Else buf = buf & c End If Next i items(num, 0) = buf items(num, 1) = q num = num + 1 '出力配列の作成 Dim items2() As Variant ReDim items2(num, 1) For i = 0 To num items2(i, 0) = items(i, 0) items2(i, 1) = items(i, 1) Next i splitRow2Col = items2 End Function '1列処理 Function convCol(sour As String) As String Dim dest As String Dim re As Object Dim pat As String dest = sour '指定文字削除 Set re = CreateObject("VBScript.RegExp") pat = "[ ]+" With re .Pattern = pat .IgnoreCase = True .Global = True End With dest = re.Replace(dest, "") Set re = Nothing convCol = dest End Function '1行処理 Function convRow(buf As String, ln As Long, path As String, fname As String) As String Dim items() As Variant Dim sour As String Dim i As Integer items = splitRow2Col(buf) '列に分解 sour = items(18, 0) items(18, 0) = convCol(sour) 'S列変換 '1行組み立て convRow = items(0, 1) & items(0, 0) & items(0, 1) For i = 1 To 18 convRow = convRow & vbTab & items(i, 1) & items(i, 0) & items(i, 1) Next i End Function '1ファイル処理 Sub convFile(path As String, fname As String) Dim ln As Long Dim buf As String Dim fname1 As String, fname2 As String fname1 = path & fname fname2 = path & fname & ".$$$" Open fname1 For Input As #1 Open fname2 For Output As #2 ln = 1 Do Until EOF(1) Line Input #1, buf buf = convRow(buf, ln, path, fname) If (buf <> "") Then Print #2, buf ln = ln + 1 Loop Close #1 Close #2 Kill fname1 'オリジナル・ファイル削除 Name fname2 As fname1 End Sub 'ファイル探索+処理実行 Sub delSpace(path As String, ext As String) Dim fcol As Object, re As Object Dim flist As Variant, remat As Variant Dim pat As String 'サブディレクトリ探索 Set fcol = CreateObject("Scripting.FileSystemObject").GetFolder(path).SubFolders For Each flist In fcol Call delSpace(path & flist.Name & "/", ext) Next flist Set fcol = Nothing '処理対象ファイル探索+処理実行 Set fcol = CreateObject("Scripting.FileSystemObject").GetFolder(path).Files Set re = CreateObject("VBScript.RegExp") pat = "\." & ext & "$" With re .Pattern = pat .IgnoreCase = True .Global = True For Each flist In fcol Set remat = .Execute(flist.Name) If remat.Count > 0 Then Call convFile(path, flist.Name) Next flist End With Set re = Nothing Set fcol = Nothing End Sub Sub main() Call delSpace("C:/test/", "txt") End Sub