1 (изменено: alexii, 2013-06-06 03:19:23)

Тема: WSH: работа с содержимым текстового файла

Всем привет!!!

У меня есть тактовый файл с наполнением типа :

[
[1318606500000,420.71,420.77,420.41,420.43],
[1318606560000,420.43,420.77,420.4,420.44],
[1318606620000,420.41,420.58,420.4,420.58],
[1318606680000,420.56,420.63,420.15,420.2]
]

Надо в предпоследнюю строку дописать в конец строки запятую после скобки, последнюю строку удалить, или переписать заново.

Т.е. что бы было так :

[1318606680000,420.56,420.63,420.15,420.2],
сюда буду вставлять строки из БД 
]

- скобка обязательна должна быть в конце.

Вот мой код :

Set wshshell = CreateObject("wscript.shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("C:\test.txt")
Set TextStream = File.OpenAsTextStream(1)
Str = vbNullString
While Not TextStream.AtEndOfStream
    Str = Str & TextStream.Line & " : " & TextStream.ReadLine() & vbCrLf
    strText = strText + 1
Wend
TextStream.Close

Set objFile = FSO.OpenTextFile("c:\Test.txt", 8)
objFile.WriteLine ("111111111111111111111111") 
objFile.Close

WScript.Echo  "Str = " & Str
WScript.Echo  "strText = " & strText
strText_m = strText -1
WScript.Echo  "strText = " & strText_m

strText_m - выводит номер предпоследней строки.

Возможно надо делать с поиском и заменой типа replace, НО когда я ищу символ "]", то у меня заменяются все символы во всем файле.

Просьба помочь, а то убился я на этом коде, а надо очень.

2

Re: WSH: работа с содержимым текстового файла

d_alexei, обратите внимание на префикс заголовка темы, на использование тэга «code», заглавных букв в начале, точек — в конце и знаков препинания — внутри предложений для придания им смысла.

Надеюсь, впредь Вы будете делать сие самостоятельно.

3

Re: WSH: работа с содержимым текстового файла

пример на Jscript

var fso = new ActiveXObject("Scripting.FileSystemObject");
var name="test.txt"
var f = fso.OpenTextFile(name, 1)
var a = []
while (!f.AtEndOfStream) {
    a[a.length] = f.ReadLine()
}
f.close()
a.length=a.length-1

var add=[
"*318606500000,420.71,420.77,420.41,420.43",
"*1318606560000,420.43,420.77,420.4,420.44"
]

for (var i=0; i<add.length; i++)
{
if (a.length>1)
a[a.length-1]+=","

a[a.length]="["+add[i]+"]"
}
a[a.length]="]"

fso.OpenTextFile(name, 2,true).Write(a.join("\r\n"))

4

Re: WSH: работа с содержимым текстового файла

А вот если бы тоже самое, но на VBScript, то было бы супер!!!

5 (изменено: Flasher, 2013-06-06 10:14:43)

Re: WSH: работа с содержимым текстового файла

d_alexei пишет:

Возможно надо делать с поиском и заменой типа replace

NL = vbNewLine
objFile.Write Replace(TextStream.ReadAll, "]" & NL & "]", "]," & NL & "[111111111111111111111111]" & NL & "]")

Вместо "111111111111111111111111" я полагаю, должна быть какая-то переменная.

6

Re: WSH: работа с содержимым текстового файла

Flasher пишет:
d_alexei пишет:

Возможно надо делать с поиском и заменой типа replace

NL = vbNewLine
objFile.Write Replace(TextStream.ReadAll, "]" & NL & "]", "]," & NL & "[111111111111111111111111]" & NL & "]")

Вместо "111111111111111111111111" я полагаю, должна быть какая-то переменная.

Выходит ошибка на этой строке : Объектная переменная не задана.

7 (изменено: Flasher, 2013-06-06 10:50:21)

Re: WSH: работа с содержимым текстового файла

Set objFile = FSO.OpenTextFile("c:\Test.txt", 2)
' код выше, а потом уже
TextStream.Close
objFile.Close

8

Re: WSH: работа с содержимым текстового файла

Итого, получается :

Set wshshell = CreateObject("wscript.shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.GetFile("C:\test.txt")
Set TextStream = File.OpenAsTextStream(1)
'Str = vbNullString
'While Not TextStream.AtEndOfStream
'    Str = Str & TextStream.Line & " : " & TextStream.ReadLine() & vbCrLf
Set objFile = FSO.OpenTextFile("c:\Test.txt", 8)
NL = vbNewLine
objFile.Write Replace(TextStream.ReadAll, "]" & NL & "]", "]," & NL & "[insert value]" & NL & "]")

    strText = strText + 1
'Wend
TextStream.Close
objFile.Close

в текстовом файле было :


[
[1317888000000,372.5101,375,372.2,372.52],
[1317888060000,372.4,373,372.01,372.16],
]

стало :

[
[1317888000000,372.5101,375,372.2,372.52],
[1317888060000,372.4,373,372.01,372.16],
][
[1317888000000,372.5101,375,372.2,372.52],
[1317888060000,372.4,373,372.01,372.16],
]

а надо :

[
[1317888000000,372.5101,375,372.2,372.52],
[1317888060000,372.4,373,372.01,372.16],
[1317888000000,372.5101,375,372.2,372.52],
[1317888060000,372.4,373,372.01,372.16]
]

т.е. убрать скобки при дописывании, убрать запятую на предпоследней строке после дописывания (иначе не обрабатывается файл).
help please!!!!!!!

PS : только заметил, текст копируется, а должен вставляться из [insert value] (будут данные из БД)

9

Re: WSH: работа с содержимым текстового файла

всем спасибо, но как бы я не хотел уйти от ReadAll , у меня не получилось
Вот тот скрипт, который в итоге заработал как надо :

Const ForReading = 1
Const ForWriting = 2
Set wshshell = CreateObject("wscript.shell")
UsrProfDir = "c:\"

ReplaceSource = "]" '??? ????
Replacetarget = "{{{{{{" ' ?? ??? ??????

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(UsrProfDir & "\Test.txt", ForReading)

strText = objFile.ReadAll
objFile.Close

NL = vbNewLine

strNewText = Replace(strText, "]" & NL & "]", "]," & NL & "[insert value]" & NL & "]")
'strNewText = Replace(strText, ReplaceSource, Replacetarget)

Set objFile = objFSO.OpenTextFile(UsrProfDir & "\Test.txt", ForWriting)
objFile.WriteLine strNewText
objFile.Close

посмотрим, что будет при объемах в 10-20-30 тыс. строк.

10

Re: WSH: работа с содержимым текстового файла

d_alexei
Я же специально красным выделил двойку. А в коде предыдущего поста опять стоит восьмёрка. В последнем уже как надо.
C Readall просто гораздо быстрее, чем склеивать построчно. Можно и без него сделать, конечно.

11

Re: WSH: работа с содержимым текстового файла

если бы тоже самое, но на VBScript, то было бы супер

Это принципиально? На JS будет несколько компактнее/лаконичнее/понятнее, но VBS гибче, если необходимо читать non-ASCII символы.

Вот еще несколько вариантов. Во всех вариантах addedLines - фейковая строка, которую надо изменить; хранилище данных, добавляемых в конце набора - может быть переменная или результат выполнения функции, "добывающей" новые данные. Общий способ вызова


cscript //nologo script.vbs <input_file >output_file

В обоих вариантах возможны вариации (с регулярным выражением, без него)

Считывая весь файл "за один присест"


option explicit
dim addedLines, stdin, stdout, re, line

addedLines = "[111]"

set stdin = WScript.StdIn
set stdout = WScript.StdOut

set re = new RegExp
re.Pattern = "(\])(\r\n)(\])"

line = stdin.ReadAll
line = re.Replace(line, "$1,$2" & addedLines & "$2$3")

stdout.Write line

Считывая файл построчно


option explicit
dim addedLines, stdin, stdout, re, line

addedLines = "[111]"

set stdin = WScript.StdIn
set stdout = WScript.StdOut

set re = new RegExp
re.Pattern = ".+\]$"

do while not stdin.AtEndOfStream
    line = stdin.ReadLine

    stdout.Write line
    if re.Test(line) then
        stdout.WriteLine ","
        stdout.Write addedLines
    end if
    stdout.WriteLine
loop

Считывая файл построчно (без проверок)


option explicit

dim addedLines, stdin, stdout, re, line

addedLines = "[111]"

set stdin = WScript.StdIn
set stdout = WScript.StdOut

set re = new RegExp
re.Pattern = "(.+\])$"

do while not stdin.AtEndOfStream
    line = stdin.ReadLine

    line = re.Replace(line, "$1," & vbNewLine & addedLines)
    stdout.WriteLine line
loop
( 2 * b ) || ! ( 2 * b )