1

我正在尝试将其他列附加到名为 Original.csv 的现有 .csv 文件中,但要附加的值应根据 N 或 J 是否是 Original 中第 4 个逗号和第 5 个逗号之间的值的一部分而有所不同。 csv(如果文件在 Excel 中打开,技术上是第 5 列)。下面是我写的代码。它们不起作用,因此仅供您参考。在此先感谢您的帮助。

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
4

2 回答 2

1

.csv 文件的正确工具是 ADO。通过将列附加到现有表来创建新(文本)表所需的只是一条 SQL 语句,例如:

SELECT S.*, 'whatever' & (IIF([B]='J','-j', '-n')) As [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. 使用未使用(和不可用)的变量(行计数器)污染您的代码
  2. 试图从同一分隔符上拆分创建的数组中拆分元素
  3. 通过 .ReadLine() 访问下一行/错误行两次

归零

于 2013-08-23T17:51:03.943 回答
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 列,使用 (#) 可以仅返回数组中该位置的值。

对字符串值进行选择案例检查,并将该行加上您的两列值重写到新文件中

完成循环后关闭新文件...

就像我说的那样,它又脏又脏,可能需要根据实际使用的文件和值进行一些调整和修改,但它应该适合您的目的。

于 2013-08-23T21:24:24.167 回答