人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

質問です
\test\のホルダーの中にtxtの拡張子のファイルが複数あります
データs列の空白行がタブと半角とになっているデータを半角を削除してタブの空白だけに
するマクロをおねがいします
s列
タブ+半角
答え
タブ

●質問者: inosisi
●カテゴリ:コンピュータ インターネット
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●10ポイント

秀丸で開いて 置換で

 \t を なしに
(\tの後に半角空白(空白の数は とりあえず ひとつで なくなるまで 繰り返し実行する)
(なし というのは 何も 入れない状態)

正規表現にチェックを入れて
置換では ダメですか?

複数ファイルの場合は、grepして置換というのを使えばいいでしょう。


きゃづみぃさんのコメント
ある程度、簡単な対応は 秀丸などのエディタを使ったほうが 便利です。 というか、マクロを作るのは ちょっと 手間ですからねぇ・・・。

inosisiさんのコメント
ありがとうございました 参考にさせていただきます

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

inosisiさんのコメント
すみません データはタブ区切りです修正できますか 申し訳ありませんよろしくおねがいします

inosisiさんのコメント
ありがとうございました 完璧です 何度もお手間とらせて申し訳ございませんでした
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ