3

私はこのコードに取り組んでいます

Dim strFirm,soNumber,strValues,arrStr,strCitrix,NewText,text

strFirm = "Gray"

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("cloud.csv",1,True)

Do while not objTextFile.AtEndOfStream
    arrStr = Split(objTextFile.ReadLine, ",")
If arrStr(0) = strFirm Then
    soNumber = arrStr(1)
Exit Do
End If
Loop

objTextFile.Close

strCitrix = soNumber + 1

MsgBox "Cloud Client " & strFirm & " is now using " & strCitrix & " Citrix licenses."

NewText = Replace(soNumber, soNumber, strCitrix)
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile("cloud.csv",2,True)
objTextFile.Writeline NewText
objTextFile.Close

ただし、コードを実行すると、書き込み中の番号を除いて、置換によってファイルのすべてのテキストが消去されます。

私がやりたいことは、他のすべてのテキストをそのままにして、指定された 1 つの変数だけを変更することです。

Client1,5
Client2,7
Client3,12
Gray,6
Client4,9
Client5,17
Client6,8

そして、スクリプトを実行した後

Client1,5
Client2,7
Client3,12
Gray,7
Client4,9
Client5,17
Client6,8

誰かが私が間違っていることを指摘できますか?

よろしくお願いいたします。

4

2 に答える 2

5

ファイルから読み取ったテキストからその番号だけを抽出するため、出力ファイルには変更する番号のみが含まれます。

soNumber = arrStr(1)

1ずつ増やします:

strCitrix = soNumber + 1

soNumberの数値(とにかく数値のみを含む) をインクリメントされた数値に置き換えます。

NewText = Replace(soNumber, soNumber, strCitrix)

そして、その新しい番号だけをファイルに書き戻します。

objTextFile.Writeline NewText

元のコンテンツの保持したい部分を保持するには、変更されたコンテンツだけでなく、それらの部分もファイルに書き戻す必要があります。

ソース ファイルを 1 行ずつ読み取る場合 (これはメモリの枯渇を回避するため、大きなファイルを処理する場合に適しています)、出力を一時ファイルに書き込む必要があります。

Set inFile  = objFSO.OpenTextFile("cloud.csv")
Set outFile = objFSO.OpenTextFile("cloud.csv.tmp", 2, True)

Do while not objTextFile.AtEndOfStream
  line = inFile.ReadLine
  arrStr = Split(line, ",")
  If arrStr(0) = strFirm Then
    soNumber = CInt(arrStr(1))
    outFile.WriteLine arrStr(0) & "," & (soNumber + 1)
  Else
    outFile.WriteLine line
  End If
Loop

inFile.Close
outFile.Close

元のファイルを変更したファイルに置き換えます。

objFSO.DeleteFile "cloud.csv", True
objFSO.MoveFile "cloud.csv.tmp", "cloud.csv"

ただし、入力ファイルが小さい場合は、ファイル全体を読み取って処理し、変更されたコンテンツでファイルを上書きする方が簡単です。

text = Split(objFSO.OpenTextFile("cloud.csv").ReadAll, vbNewLine)

For i = 0 To UBound(text)
  If Len(text(i)) > 0 Then
    arrStr = Split(text(i), ",")
    If arrStr(0) = strFirm Then
      soNumber = CInt(arrStr(1))
      text(i) = arrStr(0) & "," & (soNumber + 1)
    End If
  End If
Next

objFSO.OpenTextFile("cloud.csv", 2, True).Write Join(text, vbNewLine)

空の文字列は空の配列に分割され、チェックがエラーで失敗するLen(text(i)) > 0ため、チェックは空の行 (ファイルの末尾にある末尾の改行を含む) をスキップするためのものです。arrStr(0) = strFirmindex out of bounds

于 2013-05-24T15:17:08.210 に答える