2013-08-23 36 views
1

我試圖將附加列附加到名爲Original.csv的現有.csv文件,但要附加的值應基於N或J是Original.csv中第四個逗號和第五個逗號之間的值的一部分(技術上,如果文件在Excel中打開,則爲第五個逗號)。以下是我寫的代碼。他們不工作,所以僅供您參考。在此先感謝您的幫助。VBScript - 在.csv中查找逗號之間的特定術語,並根據找到的值附加列

rowCounter = 1 
Do Until objOriginal.AtEndofStream 
    strOriginal = objOriginal.ReadLine 
    arrOriginal = Split(strOriginal, ",") 
    arrType = Split(arrOriginal(5),",") 
    strType = arrType(1) 

    If IsTrue(InStr(strType,"N")) Then 
     strOriginal = objOriginal.ReadLine & ",Type N,USD" 
     objPosition.WriteLine(strOriginal) 
    Else 
     strOriginal = objOriginal.ReadLine & ",Type J,USD" 
     objPosition.WriteLine(strOriginal) 
    End If 
    rowCounter = rowCounter + 1 
Loop 

回答

1

.csv文件的正確工具是ADO。您需要通過將列添加到現有表來創建新的(文本)表是SQL語句,如下所示:

SELECT S. *,'whatever'&(IIF([B] ='J',' - J」, '-n'))作爲[NEWCOL] INTO [dst.csv] FROM [src.csv] S

以及 - 在一般 - 一個schema.ini文件等

[src.csv] 
ColNameHeader=True 
Format=Delimited(;) 
Col1=A Integer 
Col2=B Char Width 15 

[dst.csv] 
ColNameHeader=True 
Format=Delimited(;) 
Col1=A Integer 
Col2=B Char Width 15 
Col3=NewCol Char Width 15 

指定你的桌子結構明確。

在代碼:

' Absolute path to .CSV folder 
    Dim oFS : Set oFS = CreateObject("Scripting.FileSystemObject") 
    Dim sDS : sDS  = oFS.GetAbsolutePathName("..\Data\txt") 
' Connectionstring 
    Dim sCS : sCS  = Join(Array(_ 
     "Provider=Microsoft.Jet.OLEDB.4.0" _ 
    , "Data Source=" & sDS _ 
    , "Extended Properties=""" & Join(Array(_ 
      "Text" _ 
      , "HDR=Yes" _ 
    ), ";") & """" _ 
), ";") 
' Database/Connection 
    Dim oDb : Set oDb = CreateObject("ADODB.Connection") 
    Dim sSQL 

    oDb.Open sCS 

' show src 
    sSQL = "SELECT * FROM [src.csv]" 
    WScript.Echo sSQL 
    WScript.Echo oDb.Execute(sSQL).GetString(adClipString, , vbTab, vbCrLf, "null") 

' copy/append col to new dst 
    If oFS.FileExists(oFS.BuildPath(sDS, "dst.csv")) Then oFS.DeleteFile oFS.BuildPath(sDS, "dst.csv") 
    sSQL = "SELECT S.*, 'whatever' & (IIF([B]='J','-j', '-n')) As [NewCol] INTO [dst.csv] FROM [src.csv] S" 
    WScript.Echo "--------------" 
    WScript.Echo "Exec:", sSQL 
    oDb.Execute sSQL 

' show dst 
    sSQL = "SELECT * FROM [dst.csv]" 
    WScript.Echo "--------------" 
    WScript.Echo sSQL 
    WScript.Echo oDb.Execute(sSQL).GetString(adClipString, , vbTab, vbCrLf, "null") 

輸出:

SELECT * FROM [src.csv] 
1  J 
2  N 
3  J 
4  N 

-------------- 
Exec: SELECT S.*, 'whatever' & (IIF([B]='J','-j', '-n')) As [NewCol] INTO [dst.csv] FROM [src.csv] S 
-------------- 
SELECT * FROM [dst.csv] 
1  J  whatever-j 
2  N  whatever-n 
3  J  whatever-j 
4  N  whatever-n 

這樣你減少失誤像

  1. 污染與未使用(UND你的代碼的風險未使用)變量(rowcounter)
  2. 試圖從數組中拆分一個元素通過分在同一個分離器
  3. 訪問由.ReadLine(下一/錯線)兩次

1

創建如果你正在尋找一個簡單的降濁法...

Const ForReading = 1 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFile = objFSO.OpenTextFile("C:\Path\Original.csv", ForReading, False) 
arrLines = Split(objFile.ReadAll, vbCrLf) 
objFile.Close 

Set objFile = objFSO.CreateTextFile("C:\Path\Appended.csv", True) 

For Each strLine In arrLines 
    strType = Split(strLine, ",")(4) 

    Select Case True 
    Case InStr(1, strType, "N", 1) > 0 
     objFile.WriteLine strLine & ",Type N,USD" 
    Case InStr(1, strType, "J", 1) > 0 
     objFile.WriteLine strLine & ",Type J,USD" 
    Case Else 
     objFile.WriteLine strLine 
    End Select 
Next 
objFile.Close 

首先,您需要打開並將文件讀取到變量,您可以拆分流程中的每一行。關閉文件

創建一個新文件以寫入並遍歷每一行。 您可以通過分割拉出第5列,並使用(#)僅返回數組中該位置的值。

做一個選擇的情況下檢查字符串值,並重寫線加上你的兩個列中的值到新的文件

當你用循環中完成...

就像我說的關閉新文件它的下降和骯髒,可能需要一些調整和修改取決於實際的文件和使用的值,但它應該爲你的目的。

相關問題