'Send the first text line (row) C:\Alexander.txt to C:\Test.vbs to Line (row) n and replace

330 Views Asked by At

'i have two files

C:\Alexander.txt and C:\Test.vbs

'in C:\Alexander.txt is list of numbers.

234.6656       
-123.48872
456.75555 
345.56777853
-777.4455666
778.522222245
Etc. in down more.

'in C:\Test.vbs is script command.

WshShell.SendKeys "{TAB}"
WScript.Sleep 1
WshShell.SendKeys "{TAB}"
WScript.Sleep 1
WshShell.SendKeys "360.5"
WScript.Sleep 1
WshShell.SendKeys "{TAB}"
WScript.Sleep 1
WshShell.SendKeys "{TAB}"
WScript.Sleep 1

I want to make.

'C:\Alexander.txt Send the first text line (row) to C:\Test.vbs line four replace 360.5 with 234.6656

 '

'example click 1: 234.6656 Send text to C:\Test.vbs line four replace 360.5 with 234.6656

(or another line to be able modify the line by me)

'after send to C:\Test.vbs delete first line (row) in C:\Alexander.txt

'C:\Alexander.txt Send the first text line (row) to C:\Test.vbs line four replace 234.6656 with -123.48872

 '

'example click 2: -123.48872 Send text to C:\Test.vbs line four replace 234.6656 with -123.48872

(or another line to be able modify the line by me)

'after send to C:\Test.vbs delete first line (row) in C:\Alexander.txt

  Click Your.vbs Send and replace in C:\Test.vbs (one by one (to click mouse)
 'example click 1 Your.vbs: 234.6656
 'example click 2 Your.vbs: -123.48872
 'example click 3 Your.vbs: 456.75555
 'example click 4 Your.vbs: 345.56777853
 'example click 5 Your.vbs: -777.4455666
 'example click 6 Your.vbs: 778.522222245
 'example click 7 Your.vbs: Etc. to end last line C:\Alexander.txt**

After replace in C:\Test.vbs delete first text line (row) in C:\Alexander.txt

I want to Every click mouse to your Your.vbs to send first text line numbers C:\Alexander.txt to Test.vbs to replace....

I need your help Thank you very much for your help.

2

There are 2 best solutions below

1
On BEST ANSWER

Try this!

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFileAlexRead = objFSO.OpenTextFile("C:\Alexander.txt", 1)

strTextAlex = objFileAlexRead.ReadAll
arrFileTextAlex = Split(strTextAlex,Chr(10))
objFileAlexRead.Close

Set objFileTest = objFSO.OpenTextFile("C:\Test.vbs", 1)
strTextTest = objFileTest.ReadAll

Set regEx = New RegExp
  regEx.Pattern = """(-*)\d+.\d+\"""
  regEx.IgnoreCase = True

ReplaceTest = regEx.Replace(strTextTest, """" & Trim(Replace(arrFileTextAlex(0), vbCr, "")) & """")
objFileTest.Close


Const removalIndex = 0
For x=removalIndex To UBound(arrFileTextAlex)-1
    arrFileTextAlex(x) = arrFileTextAlex(x + 1)
Next
ReDim Preserve arrFileTextAlex(UBound(arrFileTextAlex) - 1)

Set objFileAlexWrite = objFSO.OpenTextFile("C:\Alexander.txt", 2)
dim i
For i = lbound(arrFileTextAlex) to ubound(arrFileTextAlex)  
        objFileAlexWrite.writeline arrFileTextAlex(i)  
    Next  
objFileAlexWrite.Close

Set objFileTestWrite = objFSO.OpenTextFile("C:\Test.vbs", 2)
objFileTestWrite.writeline ReplaceTest
objFileTestWrite.Close
0
On

The correct way to solve the task "read the first line of a text file and remove it" is:

  1. .ReadLine() the first line (if the file exists and is not empty)
  2. .ReadAll() the remaining lines (if any)
  3. .Write this (possibly empty) tail to the input file

The whole rigmarole with shifting redim-ed arrays is just that.

Code to experiment with:

Option Explicit

Const csFSpec = "..\data\25471573.txt"

Dim goFS : Set goFS = CreateObject("Scripting.FileSystemObject")

Select Case True
  Case Not goFS.FileExists(csFSpec)
    WScript.Echo csFSpec, "does not exist. Will create an empty file."
    goFS.CreateTextFile csFSpec
  Case 0 = goFS.GetFile(csFSpec).Size
    WScript.Echo csFSpec, "is empty. Will fill it with 3 lines."
    goFS.CreateTextFile(csFSpec).WriteLine Replace("A B C", " ", vbCrLf)
  Case Else
    Dim tsIn : Set tsIn = goFS.OpenTextFile(csFSpec)
    If tsIn.AtEndOfStream Then
       WScript.Echo "surprise - tsIn.AtEndOfStream"
    Else
       Dim sLine : sLine = tsIn.ReadLine()
       WScript.Echo "doing something interesting with", sLine
       Dim sTail : sTail = ""
       If tsIn.AtEndOfStream Then
          WScript.Echo "done with", csFSpec
       Else
          sTail = tsIn.ReadAll()
       End If
       tsIn.Close
       goFS.CreateTextFile(csFSpec).Write sTail
    End If
End Select

output:

cscript 25471573.vbs
..\data\25471573.txt does not exist. Will create an empty file.
cscript 25471573.vbs
..\data\25471573.txt is empty. Will fill it with 3 lines.
cscript 25471573.vbs
doing something interesting with A
cscript 25471573.vbs
doing something interesting with B
cscript 25471573.vbs
doing something interesting with C
done with ..\data\25471573.txt

cscript 25471573.vbs
..\data\25471573.txt is empty. Will fill it with 3 lines.

... ad infitum

The correct way to let a script do a simple set of different things is to pass some arguments to it. Re-writing the code is just ridiculous.

Code:

Option Explicit

Dim sCode : sCode = "305.77"
If 1 <= WScript.Arguments.Count Then sCode = WScript.Arguments(0)
Dim aCodes : aCodes = Split("{TIB} {TAB} X {TUB} {TOB}")
aCodes(2) = sCode

For Each sCode In aCodes
    WScript.Echo "if I would touch Sendkeys with a long pole, i wound send:", sCode
    WScript.Sleep 100
Next

output:

cscript 25471573-2.vbs
if I would touch Sendkeys with a long pole, i wound send: {TIB}
if I would touch Sendkeys with a long pole, i wound send: {TAB}
if I would touch Sendkeys with a long pole, i wound send: 305.77
if I would touch Sendkeys with a long pole, i wound send: {TUB}
if I would touch Sendkeys with a long pole, i wound send: {TOB}