1

Original.csv という既存の .csv ファイルに追加の列を追加しようとしていますが、追加する値は、Original の 4 番目のコンマと 5 番目のコンマの間の値に N または J が含まれているかどうかによって異なります。 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

シンプルで汚い方法を探しているなら...

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 番目の列を引き出すことができ、(#) を使用すると、配列内のその場所の値のみを返すことができます。

文字列値の選択ケース チェックを実行し、行と 2 つの列の値を新しいファイルに書き直します。

ループが完了したら、新しいファイルを閉じます...

私が言ったように、それはダウンして汚れており、実際のファイルと使用されている値に応じていくつかの調整と変更が必要になる場合がありますが、それはあなたの目的のために働くはずです.

于 2013-08-23T21:24:24.167 に答える
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. 使用されていない (使用できない) 変数 (rowcounter) でコードを汚染する
  2. 同じ区切り記号で分割して作成された配列から要素を分割しようとしています
  3. .ReadLine() で次/間違った行に 2 回アクセスする

ゼロに

于 2013-08-23T17:51:03.943 に答える