Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Как из строки в .txt вывести символы "которые там обновляются"в другой .txt (http://forum.oszone.net/showthread.php?t=277317)

Bombastig 07-02-2014 15:27 2304851

Как из строки в .txt вывести символы "которые там обновляются"в другой .txt
 
Пример:

PRIMER.txt

{"ticker":{"high":20.48888,"low":17.699,"avg":19.09394,"vol":10184093.59887,"vol_cur":543175.30579," last":18.2,"buy":18.29208,"sell":18.28,"updated":1391769880,"server_time":1391769881}}

Нужно вывести цифры после "last":
В примере это 18.2

Foreigner 07-02-2014 20:22 2305064

Bombastig, С помощью sed:
Код:

sed -rn "s/.*\"last\":([^,]*).*/\1/p" primer.txt
Powershell:
Код:

(gc primer.txt) -replace '.*"last":([^,]*).*','$1'

Iska 07-02-2014 20:33 2305077

Цитата:

Цитата Foreigner
Powershell: »

Зачем оффтопиком?

Iska 07-02-2014 20:50 2305091

Конечно, удобней. Я про другое: пусть будет обычным оформлением (как Вы уже исправили) — ведь язык Вы указали.

Iska 07-02-2014 21:24 2305124

Цитата:

Цитата Foreigner
А так оффтопик? »

Нет. Но во втором посте понятнее.

omegastripes 07-02-2014 21:41 2305138

Если поставлена цель выполнить задачу именно нативными компонентами Windows, идущими "из коробки", то первое, что приходит в голову - распарсить представленную в 1 посте строку JSON естественным способом, задействовав WSH JScript. Решение, конечно, не в одну строку, и представляет скорее академический интерес. Замечу, что в JSON пробел, как перед last, обычно не ставится. Для реализации на CMD/BAT - останется только "завернуть" код JScript в соответствующий командный файл.
Итак, первое - сохраняем в текстовый файл PRIMER.txt показанную выше строку JSON. Далее сохраняем в файл Eval.bat (или Eval.cmd) следующий код:
Код:

@set @x=0 /*&echo off&cscript /nologo /e:javascript %~dpf0 %*
pause
goto:eof */

if(WScript.Arguments.Count()>0){
        var sVal;
        var oFso=new ActiveXObject("Scripting.FileSystemObject");
        var sPath=WScript.Arguments(0);
        if(oFso.FileExists(sPath)){
                try{
                        var sJson=oFso.OpenTextFile(sPath).ReadAll();
                }catch(e){
                        WScript.StdOut.WriteLine('File read error: '+sPath);
                        WScript.Quit();
                }
                try{
                        eval('var oJson='+sJson);
                        sVal=oJson.ticker.last;
                }catch(e){
                        WScript.StdOut.WriteLine('JSON evaluation error: '+sJson);
                        WScript.Quit();
                }
                WScript.StdOut.WriteLine('Evaluated: '+sVal);
                var sDest = sPath+'_eval.txt';
                try{
                        var oTextStream=oFso.CreateTextFile(sDest,true);
                        oTextStream.Write(sVal);
                        oTextStream.Close();
                }catch(e){
                        WScript.StdOut.WriteLine('File save error: '+sDest);
                        WScript.Quit();
                }
                WScript.StdOut.WriteLine('Result saved to file: '+sDest);
        }else{
                WScript.StdOut.WriteLine('File not found: '+sPath);
        }
}else{
        WScript.StdOut.WriteLine('Drag and Drop file with text');
}

Что касается пробела перед last - если это была не опечатка, то строку в коде
Код:

sVal=oJson.ticker.last;
следует заменить на
Код:

sVal=oJson.ticker[' last'];
Перетаскиваем в проводнике файл PRIMER.txt на файл Eval.bat. Либо запускаем Eval.bat с параметром, в котором передаем путь к файлу PRIMER.txt. Если все пройдет без ошибок, результат будет показан в окне, и сохранен в файл PRIMER.txt_eval.txt. Если с ошибками - пояснение будет показано в окне. Допилить скрипт под свои нужды, выкинув лишние проверки, не составит особого труда.


Источники:
http://forum.script-coding.com/viewtopic.php?pid=33067
http://www.script-coding.com/WSH/FileSystemObject.html
http://forum.script-coding.com/viewtopic.php?id=2886
http://forum.script-coding.com/viewtopic.php?id=6304

Georgio 08-02-2014 04:54 2305277

Код:

:: (для "чисто" пакетного файла)

@echo off
set /p text=<PRIMER.txt
for %%i in (%text%) do (
 for /f "tokens=1* delims=:" %%j in ("%%i") do (
  if %%j=="last" (
  set /p last="%%k"<nul
  )
 )
)
pause>nul



Время: 00:56.

Время: 00:56.
© OSzone.net 2001-