Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Windows [игнор отключен] [закрыт для гостей] / BAT парсинг текстового файла / 13 сообщений из 13, страница 1 из 1
06.12.2013, 08:21
    #38491230
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
вообще задача в текстовом структурированном файле в определенной "колонке" просуммировать и добавить эту сумму в начало файла.
понемногу разбираюсь с синтаксисом, попытался вывести сначала эту колонку скриптом
Код: powershell
1.
2.
3.
for /f "tokens=2 delims=;" %%i in (%FILE%) do (
 	echo %%i
)


НО файл выглядит в виде
Код: plaintext
1.
2.
бла;бла1;бла2
;bla1;bla2
на выходе получаю
Код: plaintext
1.
2.
бла1
bla2
как это можно побороть?
...
Рейтинг: 0 / 0
06.12.2013, 08:46
    #38491243
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
BAT плохо приспособлен для таких задач. Используйте более вменяемые средства - например VBS.
...
Рейтинг: 0 / 0
06.12.2013, 08:49
    #38491245
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
Akina,

надо как то приспособить, т.к. нет возможности использовать что то еще.
...
Рейтинг: 0 / 0
06.12.2013, 08:59
    #38491255
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
Ааа... преподаватель такое задание дал... так и говори.

Такое поведение определяется идеологией работы с переменными в батч-файле. Пирсвоение пустой строки приводит к уничтожению переменной. Поэтому пустые токены не считаются. Обе команды:

Код: powershell
1.
2.
3.
for /f "tokens=2 delims=;" %i in (";бла1;бла2") do (@echo %i)

for /f "tokens=2 delims=;" %i in ("бла;;бла2") do (@echo %i)


выведут формально третью подстроку - но с точки зрения BAT-процессинга она вторая.
...
Рейтинг: 0 / 0
06.12.2013, 09:07
    #38491257
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
Akinaвыведут формально третью подстроку - но с точки зрения BAT-процессинга она вторая.
ну а выход то какой? может как то загнать в переменную и добавлять пробел вначала строки, что то никак пока не получается вторым фором это оформить.
...
Рейтинг: 0 / 0
06.12.2013, 09:31
    #38491288
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
Чтобы выкрутиться, необходимо заменить разделитель на комбинацию (символ+разделитель), а потом, после выделения нужного токена, провести обратную операцию.

Для этого потребуется как минимум одна внешняя утилита - батч-процессинг не имеет таких возможностей. А если внешняя - то почему бы не какой-нибудь более продвинутый скрипт-процессор?

И всё равно огребёшь проблемы, если выделяемый точкен окажется пустым - переменная умрёт, и батч вылетит в ошибку.
...
Рейтинг: 0 / 0
06.12.2013, 10:12
    #38491361
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
вроде заработало )
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
set FILESTR=

for /f "eol=# tokens=* delims==" %%i in (%FILE%) do (
	set FILESTR=*%%i
 	for /f "tokens=2 delims=;" %%j in ("!FILESTR!") do (
		echo %%j
	)
)
...
Рейтинг: 0 / 0
06.12.2013, 10:14
    #38491364
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
хотя вру... все верно - еще же теряются где то строки внутри...
...
Рейтинг: 0 / 0
06.12.2013, 11:44
    #38491481
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
wolverinхотя вру... все верно - еще же теряются где то строки внутри...
вот как то так тогда
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
set find=;;
set replace=; ;

for /f "eol=# delims=" %%i in (%FILE%) do (
	set FILESTR=%%i
	if "!FILESTR:~0,1!" == ";" set FILESTR= !FILESTR!
        set FILESTR=!FILESTR:%find%=%replace%!
 	for /f "tokens=3 delims=;" %%j in ("!FILESTR!") do (
		echo "%%j"
	)
)
...
Рейтинг: 0 / 0
07.12.2013, 15:45
    #38492767
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
Если я всё правильно понял, то сначала посчитать сумму и записать её в файл, а потом "приплюсовать" к нему исходный файл.

P.S. Regina REXX - всего один (исполняемый) файл и масса возможностей.
...
Рейтинг: 0 / 0
09.12.2013, 11:46
    #38493830
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
попробовал через VBS решить ту же задачу, т.к. сумма оказалась с дробной частью, теперь пытаюсь дописывать эту сумму в другой файл - получается какая то ерунда - даже если просто прочить-записать в новый файл, то он увеличивается в 2 раза!
Код: powershell
1.
2.
3.
4.
5.
6.
Set fr = fso.OpenTextFile(filename, 1, false)
Set fw = fso.CreateTextFile(filename+".note", 2, true)
Do Until fr.AtEndOfStream
	str = fr.Read(1)
	fw.Write(str)
Loop


советуют в гугле ADODB.Stream, но как дописывать в него файлы и читать построчно!?
...
Рейтинг: 0 / 0
09.12.2013, 11:47
    #38493833
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
wolverinсоветуют в гугле ADODB.Stream, но как дописывать в него СТРОКИ и читать построчно!?
...
Рейтинг: 0 / 0
09.12.2013, 13:42
    #38494026
wolverin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
BAT парсинг текстового файла
все победил
оказывается нужно приводить к кодировке, иначе возникают нюансы
Код: powershell
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Set sr = CreateObject("ADODB.Stream")
sr.Type = 2
sr.Charset = "cp866"
sr.Open()
sr.LoadFromFile(filename)
Set sw = CreateObject("ADODB.Stream")
sw.Type = 2
sw.Charset = "cp866"
sw.Open()

bEnd = true
Do Until sr.EOS
	buff = sr.ReadText(-2)
	if bEnd then
		if Left(buff, 1) <> "#" then
		'if InStr(1, buff, vbCrLf) <> "#" then
			sw.WriteText("#NOTE " + FormatNumber(summa,2,vbTrue,vbFalse,vbFalse) + vbCrLf)
			bEnd = false
			WScript.Echo summa
		end if
	end if
	sw.WriteText(buff + vbCrLf)
Loop
sr.Close
sw.SaveToFile filename+".note", 2
sw.Close
...
Рейтинг: 0 / 0
Форумы / Windows [игнор отключен] [закрыт для гостей] / BAT парсинг текстового файла / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]