1

実際、私はファイルコンバータツールを書いています。データ値は120x120マトリックスを表します。私が最初に考えたのは、2つのネストされたforループと、最初のループ内の新しい行です。簡単です。

入力ファイルには、各フィス値にvbNewLineがあります。入力ファイルを文字列に解析しましたstrAll

入力

strAllには10文字の長さの値が含まれています

"  -24.1189"  (two blanks before value)
"    1.2345"  (four blanks before value)

出力

-24.1189;-24.1189; (...total 120 values...)
-24.1234;-24.1189; (...total 120 values...)
(... total 120 rows ...)

ハットの使用Midは簡単に解析できるはずですMid(strAll, 1+i, 10+i)。ここiで、はforループのカウンターです。AReplace(stAll, " ", "")は、3つのブランク、2つのブランク、および1つのブランクをすべて削除する必要があります。

質問:文字列を行列のようにフォーマットされたファイルに出力するにはどうすればよいですか?

Dim intValueLength, maxValue, intValueInRowMax
intValueLength=10
intValueInRowMax=120
maxValues=intValueInRowMax * intValueInRowMax



Sub Strg2Array
  arrAll = array()

  ' convert to array
      For i=1 To maxValues
        ReDim Preserve arrAll(UBound(arrAll) +1)
        arrAll(UBound(arrAll)) = Mid(strAll, 1+(i-1)*intValueLength, i*intValueLength)
      Next
End Sub

Sub SaveAll
      Dim intValueInRow
      intValueInRow=0
  Const ForWriting = 2
  Set objFSOOut = CreateObject("Scripting.FileSystemObject")
  Set objOutput = objFSOOut.OpenTextFile(strFileName, ForWriting, true)
      for each value in arrAll
        objOutput.Write value
        intValueInRow = intValueInRow + 1  'Argh, there is no "++" operator?
        If (intValueInRow = intValueInRowMax) Then
          objOutput.Write vbNewLine
          intValueInRow=0
        End If
      next
objOutput.Close
Set objFSOOutput = Nothing
End Sub
4

2 に答える 2

1

1つは、手順にタイプミスがあるようですStrg2Array()

arrAlles(UBound(arrAll)) = ...

おそらく

arrAll(UBound(arrAll)) = ...

そうは言っても、別のアプローチを提案してもいいですか?あなたはこのような入力ファイルを持っているようですので:

"  -24.1189";"    1.2345";"  124.5290";"   -5.3951";"    2.1062"
"    2.6702";"  -23.1502";"   -1.5028";"   -2.6223";"  -24.3573"
...

次のように、数字だけ(二重引用符と空白なし)でセミコロンで区切られた出力を作成したいようです。

-24.1189;1.2345;124.5290;-5.3951;2.1062;...(115 more)...
...

私はもっ​​とこのようなものを使うでしょう:

Set fso = CreateObject("Scripting.FileSystemObject")

strAll = fso.OpenTextFile(WScript.Arguments.Unnamed(0), 1).ReadAll

Set re = New RegExp
re.Pattern = "\s+"

strAll = Replace(strAll, vbNewLine, ";")
strAll = Replace(strAll, """", "")
strAll = re.Replace(strAll, "")

arrAll = Split(strAll, ";")

For i = 0 To UBound(arrAll)
  WScript.StdOut.Write arrAll(i)
  If i Mod 120 = 119 Then
    WScript.StdOut.WriteLine
  Else
    WScript.StdOut.Write ";"
  End If
Next

これにより、スクリプトの最初の引数として指定されたファイルから入力が読み取られ、二重引用符と空白が削除されてから、フィールドが書き込まれますStdOut(1行あたり120フィールド)。出力を新しいファイルにリダイレクトすると、完了です。

最後の行を空のフィールドで埋める必要がある場合は、次のように追加します。

If (i Mod 120) <> 0 Then
  For n = i Mod 120 To 118   ' max. index - 1
    WScript.StdOut.Write ";"
  Next
End If

次のようにスクリプトを呼び出します。

cscript.exe input.csv > output.csv
于 2012-10-16T17:08:27.177 に答える
1

(ほぼ)Ansgarと同じアイデア、異なる実装:

  Const cnRows = 4    ' to keep the demo simple
  Const cnCols = 3
  Const csFSep = ";"
' Const csRSep = vbLf
  Dim   csRSep : csRSep = vbLf

  Dim aInps : aInps = Array( _
      Join(Array("A1  B1 C1 A2", vbLf, "B2,C2", "comment", vbCrLf, "A3 B3 C3", vbTab, "A4-B4-C4")) _
    , "1 2 3 4 5 6 7 8 9 10 11 12" _
    , Join(Array("1.1 -2.2 3.3 4", vbLf, "0.5 -6.6", "comment", vbCrLf, "7 8.0 -9.99", vbTab, "10.10*11.11***-12.12")) _
  )
  ' no need to care for the input format, as long as the valid data can be
  ' specified by a RegExp pattern (and the file contains 'enough' info)
  Dim reCut : Set reCut = New RegExp
  reCut.Global  = True
  reCut.Pattern = "([A-Z-])?\d+(\.\d+)?"

  Dim sInp
  For Each sInp In aInps
      WScript.Echo Join(Array("----", vbCrLf, sInp, vbCrLf, "----"), "")
      Dim oMTS : Set oMTS = reCut.Execute(sInp)
      If oMTS.Count <> cnRows * cnCols Then
         WScript.Echo "Bingo:", oMTS.Count, "<>", (cnRows * cnCols)
      Else
         Dim m
         For m = 0 To oMTS.Count - 1
             WScript.Stdout.Write oMTS(m).Value
             If 0 = (m + 1) Mod cnCols Then WScript.Stdout.Write csRSep Else WScript.Stdout.Write csFSep
         Next
      End If
  Next

出力:

----
A1  B1 C1 A2
 B2,C2 comment
 A3 B3 C3        A4-B4-C4
----
A1;B1;C1
A2;B2;C2
A3;B3;C3
A4;B4;C4
----
1 2 3 4 5 6 7 8 9 10 11 12
----
1;2;3
4;5;6
7;8;9
10;11;12
----
1.1 -2.2 3.3 4
 0.5 -6.6 comment
 7 8.0 -9.99     10.10*11.11***-12.12
----
1.1;-2.2;3.3
4;0.5;-6.6
7;8.0;-9.99
10.10;11.11;-12.12

私のパターンは有効なデータを識別しようとし、(おそらくコストのかかる)文字列操作を回避します。

于 2012-10-16T17:39:59.363 に答える