Board logo

標題: [發問] 如何拆檔和結合新插入的指定文字檔 [打印本頁]

作者: luke    時間: 2012-6-2 16:44     標題: 如何拆檔和結合新插入的指定文字檔

各位大大

我有1個文字檔由300個檔案左右組合而成,並由括弧區隔如下說明
1.開啟TEST.21csv文字檔,該檔由多個csv文字檔組成,見括弧內[*檔名*],
如A01.csv,CC0001.csv和E00001.csv,檔名下方為檔案內容,
包含不同數量組合的行列數(檔案大小不相等),
直至空白列後會出現[*div*]為該檔結尾
,然後是接續下一個檔名.

問題1:如何將TEST.21csv文字檔內的全部檔案,
            依照檔案名字拆出來,
            依序拆成A01.csv,CC0001.csv和E00001.csv.

問題2:如何把新增的文字檔如BB01.csv和DD1.csv,
             依照英文檔名文字排列順序,
            按先後順序填入檔名和檔尾詞,
            放入至TEST21.csv文字檔
            並轉存成至TEST21OK.csv.
(結果如附件)

煩請先進 大大指導

[attach]11229[/attach]
作者: GBKEE    時間: 2012-6-4 11:38

本帖最後由 GBKEE 於 2012-6-4 12:06 編輯

回復 1# luke
試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Ar, E As Variant, xi As Integer, xlCsv As String, xlPath As String
  4.     Dim Sh(1 To 2) As Worksheet
  5.     xlPath = ThisWorkbook.Path & "\"                                '->修改為正確的檔案路徑
  6.     Set Sh(1) = Workbooks.Open(xlPath & "test21.csv").Sheets(1)
  7.     Set Sh(2) = Sh(1).Parent.Sheets.Add
  8.     Sh(1).Cells.Copy Sh(2).Cells(1)                                 '複製 test21.csv 的資料                             '
  9.     xlCsv = Dir(xlPath & "*.Csv")                                   '尋找 *.Csv檔案
  10.     Do While xlCsv <> "" And LCase(xlCsv) <> "test21.csv"
  11.         With Workbooks.Open(xlPath & xlCsv).Sheets(1)
  12.             Sh(2).Cells(Rows.Count, 1).End(xlUp).Offset(2) = "[*" & xlCsv & "*]"
  13.             .[a1].CurrentRegion.Copy Sh(2).Cells(Rows.Count, 1).End(xlUp).Offset(1)
  14.             .Parent.Close 0
  15.         End With
  16.         xlCsv = Dir
  17.     Loop
  18.      With Sh(2)
  19.         .Activate
  20.         For Each E In ActiveWorkbook.Names
  21.             '刪除所有已定義的名稱 以避免 : 定義的名稱中有不在的 *.Csv
  22.              E.Delete
  23.         Next
  24.        '*** 處裡 已匯入的 *.Csv  *********
  25.         Ar = .Range("a:a").Value
  26.        .Range("a:a").Replace "[*.*]", "=1/0"                                '[*.Csv] 替代為錯誤值
  27.        .Range("a:a").SpecialCells(xlCellTypeFormulas, xlErrors).Select      '選擇有錯誤值的儲存格
  28.         .Range("a:a").Value = Ar                                            '複原原來的值
  29.         For Each E In Selection
  30.             E.CurrentRegion.Name = Replace(Replace(E, "*]", ""), "[*", "")
  31.             '每一儲存格的延伸範圍: 定義名稱  *.Csv
  32.         Next
  33.         '****************************
  34.         Sh(1).Cells.Clear      'test21.csv.Sheets(1) :清除所有資料 重新匯入排序後的*.Csv
  35.         For Each E In ActiveWorkbook.Names             '定義名稱 :會自動排序名稱
  36.             xi = Sh(1).Cells(Rows.Count, 1).End(xlUp).Row
  37.             xi = IIf(xi = 1, 1, xi + 2)
  38.             Range(E.Name).Copy Sh(1).Cells(xi, 1)
  39.             xi = Sh(1).Cells(Rows.Count, 1).End(xlUp).Row
  40.             Sh(1).Cells(xi + 2, 1) = "[*div*]"
  41.         Next
  42.         Application.DisplayAlerts = False
  43.         .Delete                                         '刪除工作表
  44.         Application.DisplayAlerts = True
  45.     End With
  46.     '*****  測試 成功後 解除註解 可存檔
  47.     'Sh(1).Parent.Close True
  48. End Sub
複製代碼

作者: luke    時間: 2012-6-4 15:21

回復 2# GBKEE

   當檔案名字中有連結符號 "-" 如BB-1.csv時
   會出現執行階段錯誤 '1004'
    [attach]11248[/attach]
   煩請先進  指導 謝謝
   [attach]11249[/attach]
作者: GBKEE    時間: 2012-6-4 15:49

回復 3# luke
BB-1.csv  ->  BB_1.csv
作者: luke    時間: 2012-6-4 21:16

回復 4# GBKEE

   因主檔名無法修改
    原#2第30列語法
   E.CurrentRegion.Name = Replace(Replace(E, "*]", ""), "[*", "")
   是否可將"定義名稱 " 所指向的檔名用split分割後
   再加上連結符號 "-" 作關鍵字替代
   如BB-1先分成 BB和數字"1"
   再結合檔名成文字"BB"&"-"&"1"

    以上想法
    煩請指導
    謝謝!
作者: GBKEE    時間: 2012-6-5 05:58

本帖最後由 GBKEE 於 2012-6-5 21:34 編輯

回復 5# luke
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Sh(1 To 2) As Worksheet, Ar, E As Variant, xlCsv As String, xlPath As String
  4.     Dim xi As Integer, xR As Integer, xF As Integer
  5.     xlPath = ThisWorkbook.Path & "\"                                                '->修改為正確的檔案路徑
  6.     Set Sh(1) = Workbooks.Open(xlPath & "test21.csv").Sheets(1)
  7.     Set Sh(2) = Sh(1).Parent.Sheets.Add
  8.     Sh(1).Cells.Copy Sh(2).Cells(1)                                                 '複製 test21.csv 的資料                          '
  9.     xlCsv = Dir(xlPath & "*.Csv")                                                   '尋找 *.Csv檔案
  10.     Do While xlCsv <> "" And LCase(xlCsv) <> "test21.csv"
  11.      With Workbooks.Open(xlPath & xlCsv).Sheets(1)
  12.            Sh(2).Cells(Sh(2).Rows.Count, 1).End(xlUp).Offset(2) = "[*" & xlCsv & "*]"
  13.            .[a1].CurrentRegion.Copy Sh(2).Cells(Sh(2).Rows.Count, 1).End(xlUp).Offset(1)  '複製 *.Csv的資料
  14.            .Parent.Close 0
  15.      End With
  16.      xlCsv = Dir
  17.     Loop
  18.     Sh(1).Cells.Clear     'test21.csv.Sheets(1) 清除所有資料: 已備重新匯入排序後的*.Csv
  19.     '*** 處裡 已匯入的 *.Csv*********
  20.     With Sh(2)
  21.         .Activate
  22.         Ar = .Range("a:a").Value
  23.         .Range("a:a").Replace "[*.*]", "=1/0"                                       '[*.Csv] 替代為錯誤值
  24.         .Range("a:a").SpecialCells(xlCellTypeFormulas, xlErrors).Name = "檔名"      '將有錯誤值的儲存格 定義名稱
  25.         .Range("a:a").Value = Ar                                                    '複原原來的值
  26.         With .Columns(Columns.Count)
  27.             [檔名].Copy .Cells(1)
  28.             .Sort Key1:=.Range("a1"), Order1:=xlAscending, Header:=xlGuess          '排序[檔名]
  29.             xR = 1
  30.             Do While .Cells(xR) <> ""                                               '匯入 "檔名"資料
  31.                 xF = Application.Match(.Cells(xR), .Parent.Columns(1), 0)           '尋找 "檔名"
  32.                 xi = Sh(1).Cells(Sh(1).Rows.Count, 1).End(xlUp).Row
  33.                 xi = IIf(xi = 1, 1, xi + 2)                                         '第二個[*.Csv]以後 須再往下位移到2列
  34.                 .Parent.Cells(xF, 1).CurrentRegion.Copy Sh(1).Cells(xi, 1)
  35.                 xi = Sh(1).Cells(Sh(1).Rows.Count, 1).End(xlUp).Row
  36.                 Sh(1).Cells(xi + 2, 1) = "[*div*]"
  37.                 xR = xR + 1
  38.             Loop
  39.         End With
  40.         Application.DisplayAlerts = False
  41.         .Delete                                      '刪除工作表
  42.         Application.DisplayAlerts = True
  43.     End With
  44.     '*****測試 成功後 解除註解 可存檔
  45.     'Sh(1).Parent.Close True
  46. End Sub
複製代碼

作者: luke    時間: 2012-6-5 21:01

回復 6# GBKEE

    帶入#6新程式後執行至第12列會出現下列錯誤信息

   [attach]11272[/attach]

   查下列網址時有提到為圖表變更錯誤, 但實際工作表上並無任何圖表
   http://support.microsoft.com/kb/211436/zh-tw  
   
   不知此問題是否檔案過多(200~300個檔)造成
   
   煩請指導
作者: GBKEE    時間: 2012-6-5 21:38

回復 7# luke
版本的問題
6#程式碼以更新 試試看
作者: Hsieh    時間: 2012-6-5 23:24

回復 7# luke
  1. Sub Split_CSV()
  2. Dim Ar(), Ay()
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Application.DisplayAlerts = False
  5. Application.ScreenUpdating = False
  6. fd = ThisWorkbook.Path & "\"
  7. fs = fd & "TEST21.csv"
  8. Set wb = Workbooks.Open(fs)
  9. yn = False
  10.   With wb.Sheets(1) '分割檔案
  11.   k = .UsedRange.Columns.Count
  12.      For Each a In .Range(.[A1], .Cells(.Rows.Count, 1).End(xlUp))
  13.         If yn = False And InStr(a, ".csv") > 0 Then _
  14.         yn = True: r = 1: _
  15.          f = Replace(Replace(Replace(a, "[", ""), "]", ""), "*", ""): _
  16.          Set sh = wb.Sheets.Add(after:=wb.Sheets(1))
  17.          Ar = a.Resize(, k).Value
  18.          With sh
  19.          If yn = True Then
  20.          .Cells(r, 1).Resize(, k) = Ar: r = r + 1
  21.          ReDim Preserve Ay(s)
  22.          Ay(s) = Join(Application.Transpose(Application.Transpose(Ar)), Chr(9))
  23.          s = s + 1
  24.          End If
  25.          End With
  26.         If InStr(a, "div") > 0 Then fs = fd & "結果\" & f: yn = False: sh.Move: ActiveWorkbook.SaveAs fd & "結果\" & f, 6: Workbooks(f).Close:        d(f) = Join(Ay, Chr(10)): Erase Ay: s = 0
  27.      Next
  28.     End With
  29. wb.Close 0
  30.     fs = Dir(fd & "*.csv")
  31.     Do Until fs = ""
  32.     If fs <> "TEST21.csv" Then
  33.     Set wb = Workbooks.Open(fd & fs)
  34.     With wb.Sheets(1)
  35.     k = .UsedRange.Columns.Count
  36.     ReDim Ar(k)
  37.     Ar(0) = "[*" & fs & "*]"
  38.       For i = 1 To k - 1
  39.         Ar(i) = ""
  40.       Next
  41.     ReDim Preserve Ay(s)
  42.     Ay(s) = Join(Ar, Chr(9))
  43.     s = s + 1
  44.     For Each a In .UsedRange.Columns(1).Cells
  45.        Ar = a.Resize(, k).Value
  46.     ReDim Preserve Ay(s)
  47.     Ay(s) = Join(Application.Transpose(Application.Transpose(Ar)), Chr(9))
  48.     s = s + 1
  49.     Next
  50.     ReDim Preserve Ay(s)
  51.     Ay(s) = Join(Array("", "", "", "", "", "", "", ""), Chr(9))
  52.     s = s + 1
  53.     ReDim Ar(k)
  54.     Ar(0) = "[*div*]"
  55.       For i = 1 To k - 1
  56.         Ar(i) = ""
  57.       Next
  58.     ReDim Preserve Ay(s)
  59.     Ay(s) = Join(Ar, Chr(9))
  60.     s = s + 1
  61.     d(fs) = Join(Ay, Chr(10))
  62.     Erase Ay: s = 0
  63.     End With
  64.     wb.Close 0
  65.     End If
  66.     fs = Dir
  67.     Loop
  68. With Worksheets.Add
  69. .[A1].Resize(d.Count, 1) = Application.Transpose(d.keys)
  70. .[A1].Resize(d.Count, 1).Sort key1:=.[A1], Header:=xlNo
  71. Ar = .[A1].Resize(d.Count, 1).Value
  72. r = 1
  73. For Each ky In Ar '組合檔案
  74.    an = Split(d(ky), Chr(10))
  75.    For j = 0 To UBound(an)
  76.      ak = Split(an(j), Chr(9))
  77.      .Cells(r, 1).Resize(, UBound(ak) + 1) = ak
  78.      r = r + 1
  79.    Next
  80.    r = r + 1
  81. Next
  82. .Move
  83. ActiveWorkbook.SaveAs fd & "結果\" & "TEST21OK.csv", 6
  84. ActiveWorkbook.Close 1
  85. End With
  86. Application.DisplayAlerts = True
  87. Application.ScreenUpdating = True
  88. End Sub
複製代碼

作者: luke    時間: 2012-6-6 00:08

回復 8# GBKEE


    測試#6更新程式後, 目前發現有2個問題
     1.新插入的主檔名若大於原始檔TEST21時,
         如TEST22.csv(22>21)或TF.csv(TF>TE),
         雖無錯誤發生, 實際無檔案產生.

     2.主檔名帶有"Monitor"例如MonitorTempContSet.csv和MonitorTimInv.csv兩個檔案
         執行排序時會與TempContSet.csv和TimInv.csv衝突
         其情形是MonitorTempContSet.csv和MonitorTimInv.csv個共出現兩次
         並直接覆蓋後者即TempContSet.csv和TimInv.csv會從原始檔消失不見
         (但檔名MonitorAbb.csv和MonitorAbc.csv卻不會與Abb.csv和Abc.csv衝突)
         研判是排序[檔名]錯亂造成

  以上錯誤
     煩請指導
     謝謝!
作者: GBKEE    時間: 2012-6-6 07:01

本帖最後由 GBKEE 於 2012-6-6 07:03 編輯

回復 10# luke
7# 的問題 是2003 以上的版本 使用End 屬性,如有計算  Rows.Count  或 Columns.Count 須指明它的父層物件
Sh(1).Rows.Count  或 Sh(1).Columns.Count
10# 的問題 修正用Find 取代 Match 找到 真正的字串 試試看
  1. Option Explicit
  2. Sub Ex()
  3.     Dim Sh(1 To 2) As Worksheet, Ar, E As Variant, xlCsv As String, xlPath As String
  4.      Dim xi As Integer, xR As Integer, xF As Range, xlRowsCount As Long
  5.     xlRowsCount = ActiveSheet.Rows.Count
  6.     xlPath = ThisWorkbook.Path & "\"                                                '->修改為正確的檔案路徑
  7.     Set Sh(1) = Workbooks.Open(xlPath & "test21.csv").Sheets(1)
  8.     Set Sh(2) = Sh(1).Parent.Sheets.Add                                             '新增工作表作為 資料暫存
  9.     Sh(1).Cells.Copy Sh(2).Cells(1)                                                 '複製 test21.csv 的資料                          '
  10.     xlCsv = Dir(xlPath & "*.Csv")                                                   '尋找 *.Csv檔案
  11.     Do While xlCsv <> "" And LCase(xlCsv) <> "test21.csv"
  12.      With Workbooks.Open(xlPath & xlCsv).Sheets(1)
  13.            Sh(2).Cells(xlRowsCount, 1).End(xlUp).Offset(2) = "[*" & xlCsv & "*]"
  14.            .[a1].CurrentRegion.Copy Sh(2).Cells(xlRowsCount, 1).End(xlUp).Offset(1)  '複製 *.Csv的資料
  15.            .Parent.Close 0
  16.      End With
  17.      xlCsv = Dir
  18.     Loop
  19.     Sh(1).Cells.Clear     'test21.csv.Sheets(1) 清除所有資料: 已備重新匯入排序後的*.Csv
  20.     '*** 處裡 已匯入的 *.Csv*********
  21.     With Sh(2)
  22.         .Activate
  23.         Ar = .Range("a:a").Value
  24.         .Range("a:a").Replace "[*.*]", "=1/0"                                       '[*.Csv] 替代為錯誤值
  25.         .Range("a:a").SpecialCells(xlCellTypeFormulas, xlErrors).Name = "檔名"      '將有錯誤值的儲存格 定義名稱
  26.         .Range("a:a").Value = Ar                                                    '複原原來的值
  27.         With .Columns(Columns.Count)
  28.             [檔名].Copy .Cells(1)
  29.             .Sort Key1:=.Range("a1"), Order1:=xlAscending, Header:=xlNo             '排序[檔名]
  30.             xR = 1
  31.             Do While .Cells(xR) <> ""                                               '匯入 "檔名"資料
  32.                Set xF = .Parent.Columns(1).Find(.Cells(xR).Text, LookAT:=xlWhole)   '尋找 "檔名"
  33.                 xi = Sh(1).Cells(xlRowsCount, 1).End(xlUp).Row
  34.                 xi = IIf(xi = 1, 1, xi + 2)                                         '第二個[*.Csv]以後 須再往下位移到2列
  35.                 xF.CurrentRegion.Copy Sh(1).Cells(xi, 1)
  36.                 xi = Sh(1).Cells(xlRowsCount, 1).End(xlUp).Row
  37.                 Sh(1).Cells(xi + 2, 1) = "[*div*]"
  38.                 xR = xR + 1
  39.             Loop
  40.         End With
  41.         Application.DisplayAlerts = False
  42.         .Delete                                                                      '刪除資料暫存工作表
  43.         Application.DisplayAlerts = True
  44.     End With
  45.     '*****測試 成功後 解除註解 可存檔
  46.     'Sh(1).Parent.Close True
  47. End Sub
複製代碼

作者: luke    時間: 2012-6-6 21:13

回復 9# Hsieh

     謝謝H大

    插入BB-1.csv和DD1.csv兩個檔所新建立的TEST21OK.csv,
    其檔尾處顯示[**]如附件
    [attach]11286[/attach]
作者: Hsieh    時間: 2012-6-6 21:22

回復 12# luke

我測試OK阿
[attach]11287[/attach]
作者: luke    時間: 2012-6-6 21:34

回復 11# GBKEE

     #11新修改程式測試後,
     排序情形變得很錯亂
     
     因檔名長和檔案很多
     我的想法是將檔案分別存檔後
     再依照排列順序
     結合一起
     如H超版於#9程式
     (但此程式採Chr(9)方式結合, 無法順利通過編譯)
     
     以上想法
     
    煩請指導
作者: luke    時間: 2012-6-6 21:40

回復 14# luke


    H大好

   #9 第54列Ar(0) = "[*div*]"不小心打成 Ar(0) = "[**]"
     
  謝謝回覆
作者: GBKEE    時間: 2012-6-6 21:44

回復 14# luke
排序情形變得很錯亂
可以看看嗎?
作者: luke    時間: 2012-6-6 23:48

回復 16# GBKEE


    謝謝版大

    存檔時如何把ANSI文字檔格式改成Unicode文字檔格式

    以下是用巨集錄製語法
    ActiveWorkbook.SaveAs Filename:="D:\TEST21OK.txt", _
    FileFormat:=xlUnicodeText, CreateBackup:=False

    應如何套到#9和#11程式?
   
    煩請指導 謝謝
作者: GBKEE    時間: 2012-6-7 06:25

回復 17# luke
Sh(1).Parent.Close True
Sh(1).Parent.SaveAs Filename:="D:\TEST21OK.txt", FileFormat:=xlUnicodeText, CreateBackup:=False

ActiveWorkbook.SaveAs fd & "結果\" & "TEST21OK.csv", 6
ActiveWorkbook.SaveAs  "D:\TEST21OK.txt", FileFormat:=xlUnicodeText, CreateBackup:=False
作者: luke    時間: 2012-6-7 19:12

本帖最後由 luke 於 2012-6-7 21:20 編輯

回復 18# GBKEE

    謝謝版大

   文字檔存檔格式已解決.

   TEST21OK.csv檔案可否按照順序除去檔案首列名字[*檔名.csv*]和檔案結尾[*div*]和前一個空白列,
   僅留中間內容如附件所示的檔案,
    (或使用#9程式於拆檔轉存Unicode文字檔格式時, 不要帶入上述檔名和結尾)
      
    煩請指導 謝謝!
   [attach]11312[/attach]
作者: luke    時間: 2012-6-7 21:43

回復 18# GBKEE


    文件已上傳

     煩請指導 謝謝
作者: GBKEE    時間: 2012-6-8 10:40

回復 20# luke
  1. Option Explicit
  2. Sub 刪檔名()
  3.     Dim xi As Integer
  4.     With Workbooks("TEST21OK.CSV").Sheets(1)
  5.         .[A:A].Replace "[*]", "=1/0"
  6.         .Range("A:A").SpecialCells(xlCellTypeFormulas, xlErrors).Name = "xx"
  7.         .Range("xx").EntireRow.Delete
  8.         .Range("a:a").SpecialCells(xlCellTypeBlanks).Name = "xx"
  9.         For xi = 1 To .Range("xx").Areas.Count - 1
  10.             .Range("xx").Areas(xi).Cells(1).EntireRow.Delete
  11.          Next
  12.     End With
  13. End Sub
複製代碼

作者: luke    時間: 2012-6-8 13:57

回復 21# GBKEE

版大好

我想將檔案做拆檔即開啟TEST21.csv文字檔,
找到[*檔名.csv*]和結尾詞[*div*],
將兩者之間的檔案內容取出後,
按順序存成Unicode文字檔格式.

例如: 此檔TEST21.csvㄝ數量有5個檔案,
依據每個檔案對應內容轉存成5個新檔.
A01.csv
BB-1.csv
CC0001.csv
DD1.csv
E00001.csv
(PS: [*檔名.csv*]和結尾詞[*div*]不要存入新檔)

[attach]11318[/attach]
作者: GBKEE    時間: 2012-6-8 16:31

回復 22# luke
  1. Option Explicit
  2. Sub 拆檔()
  3.     Dim Ar(), MyPath As String, E As Range, Rng As Range, xlFileName As String
  4.     Dim ArFile(), Msg As String
  5.      'CurDir  傳回一個 Variant (String),用來代表目前的路徑。
  6.     MyPath = CurDir & "\"  '自行修改正確路徑。
  7.     If Dir(MyPath & "*.csv") <> "" Then Kill MyPath & "*.csv"   '刪除目前的路徑下的.cgs 檔案
  8.     With Workbooks("TEST21.csv").Sheets(1)
  9.         Ar = .Range("a:a").Value
  10.         .Range("a:a").Replace "[*.*]", "=1/0"                                       '[*.*] 替代為錯誤值
  11.         .Range("a:a").SpecialCells(xlCellTypeFormulas, xlErrors).Name = "xx"        '定義名稱: 錯誤值的儲存格
  12.         .Range("a:a").Value = Ar
  13.         For Each E In .[XX]
  14.             Set Rng = E.CurrentRegion
  15.             Set Rng = .Range(E.Cells(2, 1), Rng.Cells(Rng.Rows.Count, Rng.Columns.Count))
  16.             xlFileName = Replace(Replace(E, "[*", ""), "*]", "")
  17.             With Workbooks.Add(1)
  18.                 Rng.Copy .Sheets(1).[a1]
  19.                 .SaveAs MyPath & xlFileName, xlUnicodeText
  20.                 .Close 0
  21.             End With
  22.          Next
  23.          .Parent.Close 0
  24.     End With
  25. End Sub
複製代碼

作者: luke    時間: 2012-6-8 20:55

本帖最後由 luke 於 2012-6-9 23:21 編輯

回復 23# GBKEE

測試sub 組檔()

謝謝版大




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)