2010-05-18 89 views
0

我有一個龐大的Excel電子表格,其中包含電話通話費率的許多不同的國家。從MS Excel中導出和重新格式化數據

列的格式是: 國家,RateLocality,前綴,速率,批發

例如阿富汗伊斯坦布爾,默認93,930,931,9321,9322,9323,9324,9325,9326,9327,9329,9331,9332,9333,9334,9335,9336,9337,9338,9339,9341,9342 ; 9343; 9344; 9345; 9346; 9347; 9348; 9349; 9351; 9352; 9353; 9354; 9355; 9356; 9357; 9358; 9359; 9361; 9362; 9363; 9364; 9365; 9366; 9367; 9368; 9369 ; 9371; 9372; 9373; 9374; 9376; 938; 939; $ 1.023,$ 0.455

這些利率每隔一段時間就會變化一次,我需要將它們轉換到另一個可以使用CSV導入它們的系統。最終格式爲:

最終格式爲:

LD PREPEND CODE ie。 00或011,國家代碼,地區代碼,評論,連接成本,包括秒,每分鐘成本,價格表,增量

所以要轉換上面的線我會有 00,「阿富汗」,93,「默認」 ,1.023,60,1.023,10 00,「Afganistan」,931,「Default」,1.023,60,1.023,10 ... 00,「Afganistan」,939,「Default」,1.023,60,1.023 ,10

其中00,60和10被硬編碼並與excel中的其他數據合併。

如何將這些數據導出爲所需的格式,因爲我需要重新格式化它。

我應該導出到XML並使用XSLT或其他進程將數據按摩到CSV嗎? 如果是這樣的話,我該如何簡單快速地做到這一點。

回答

1

您可以使用VBA將數據寫入新工作簿,然後另存爲CSV。事情是這樣的:

Sub ConvertRates() 

    Dim strCountry As String 
    Dim strRateLocality As String 
    Dim strCodes As String 
    Dim dblRate As Double 
    Dim dblWholesale As Double 
    Dim vntCodes As Variant 
    Dim i As Integer 
    Dim lngRow As Long 

    Dim rngData As Range 
    Dim rngRow As Range 
    Dim wks As Worksheet 
    Dim wkbkNew As Workbook 
    Dim wksNew As Worksheet 

    Set wks = ThisWorkbook.Worksheets("Sheet1") 
    Set rngData = wks.Range("A2:B3") 

    Application.Workbooks.Add 
    Set wkbkNew = ActiveWorkbook 
    Set wksNew = ActiveSheet 

    lngRow = 1 

    For Each rngRow In rngData.Rows 
     strCountry = wks.Cells(rngRow.Row, 1).Value 
     strRateLocality = wks.Cells(rngRow.Row, 2).Value 
     strCodes = wks.Cells(rngRow.Row, 3).Value 
     dblRate = wks.Cells(rngRow.Row, 4).Value 
     dblWholesale = wks.Cells(rngRow.Row, 5).Value 
     vntCodes = Split(strCodes, ";") 

     For i = 0 To UBound(vntCodes) 
      If vntCodes(i) <> "" Then 
       wksNew.Cells(lngRow, 1).Value = "'00" 
       wksNew.Cells(lngRow, 2).Value = strCountry 
       wksNew.Cells(lngRow, 3).Value = vntCodes(i) 
       wksNew.Cells(lngRow, 4).Value = strRateLocality 
       wksNew.Cells(lngRow, 5).Value = dblRate 
       wksNew.Cells(lngRow, 6).Value = 60 
       wksNew.Cells(lngRow, 7).Value = dblRate 
       wksNew.Cells(lngRow, 8).Value = 10 
       lngRow = lngRow + 1 
      End If 
     Next i 

    Next rngRow 

End Sub 

你可能會需要一個if語句,以確定是否要寫入00或011,明顯改變代碼,使用相關的工作表和範圍。

我還沒有建立很多測試,除了檢查以確保代碼不是空的,因爲您似乎在代碼列表的末尾有一個分號,但是您可能希望在將數據寫入新工作簿之前做更多的檢查。

+0

謝謝,只有一點點調整,做了伎倆。 – Matt 2010-05-19 01:27:00

0

我不明白爲什麼你不會使用file-> save as,將格式更改爲csv,然後用腳本修改csv。大多數腳本語言都有用於讀取CSV文件並修改它們的好工具(R,python等)

+0

這就是我打算這麼做的原因,但事實證明,dendarii的答案几乎開箱即用,並且很快實施。 – Matt 2010-05-19 06:29:16