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

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

ateka 17-06-2020 14:41 2925327

Необходимо прочитать и сериализовать текстовый файл в переменную
 
Здравствуйте, ищу помощи в с следующей задачей:
Есть текстовый файл с строками:
Код:

зайка
котик
ослик

тигрёнок

бабочка

Пытаюсь преобразовать его в json и поместить в переменную.
Искомый результат:
Код:

зайка\nкотик\nослик\n\nтигрёнок\n\nбабочка
То есть надо прочитать текстовик построчно и добавить в конец строки \n и результат дописать в конец самой переменной.
На данный момент есть следующий код
Код:

SETLOCAL EnableDelayedExpansion
for /f "delims=" %%x in (commx.txt) do (
set _var=!_var!\n%%x
)
echo %_var%

Но он пропускает пустые строки а они важны.
И ещё вопрос. Мой файл на 65000 символов.
CMD такие переменные точно не поддерживает.
А новый Windows terminal потянет?
Спасибо.

Fors1k 17-06-2020 16:17 2925335

Код:

param(
    $path="C:\qwe.txt"
)cls

$result=(gc $path -raw).Replace("`r`n",'\n')
$result


Foreigner 17-06-2020 18:23 2925343

Fors1k, а зачем ты пишешь cls после блока param? Не могу этого понять, зачем?

Fors1k 17-06-2020 18:35 2925345

Вложений: 2
доФайл 161731
после:Файл 161732
cls обеспечивает чистоту и свежий запах в консоли после выполнения кода :)

ateka 17-06-2020 18:52 2925346

Цитата:

Цитата Fors1k
$result »

С пошиком проблема в том что МС накрутила ограничений на скрипты очень много.
Пока запустишь - уже не надо.
А так конечно спасибо. У меня локально работает.
Правда на большом файле (65к) ещё не проверял.

Корявое решение на cmd
Код:

SetLocal EnableDelayedExpansion
for /f "delims=" %%I in ('findstr /n "^" "foo.txt"') do (
set _TempVar_01=%%I
set _TempVar_02=!_TempVar_01:~2!\n
set _ResultVar_01=!_ResultVar_01!!_TempVar_02!
)
echo !_ResultVar_01!


Foreigner 17-06-2020 18:52 2925347

Цитата:

Цитата Fors1k
cls обеспечивает чистоту и свежий запах в консоли после выполнения кода »

Понятно, просто для читаемости.

ateka 17-06-2020 20:18 2925353

С CMD у меня не получается.
Кто-то знает что именно надо дописать что бы ПоШ из батника заработал?
Команда
Код:

powershell (gc .\foo.txt -raw).Replace("`r`n",'\n')
Ругается:
Код:

At line:1 char:29
+ (gc .\foo.txt -raw).Replace(`r`n,'\n')
+                            ~
Missing ')' in method call.
At line:1 char:29
+ (gc .\foo.txt -raw).Replace(`r`n,'\n')
+                            ~~~~
Unexpected token '`r`n' in expression or statement.
At line:1 char:33
+ (gc .\foo.txt -raw).Replace(`r`n,'\n')
+                                ~
Missing argument in parameter list.
At line:1 char:38
+ (gc .\foo.txt -raw).Replace(`r`n,'\n')
+                                      ~
Unexpected token ')' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : MissingEndParenthesisInMethodCall


Iska 17-06-2020 20:31 2925357

ateka, ему не надо «работать из батника».

Foreigner 17-06-2020 20:51 2925360

Цитата:

Цитата ateka
Replace("`r`n",'\n') »

Это так не работает. В строке нет последвательности символов "`r`n"

Не путайте Replace-метод и replace-оператор, первый меняет строку на строку, а второй ищет regex-паттерн и меняет на строку:
Код:

PS > 'aaa'.Replace('a','b')
bbb
PS > 'aaa' -replace 'a{2}','b'
ba

Аналогично со split.

Fors1k 17-06-2020 21:05 2925364

Цитата:

Цитата ateka
С CMD у меня не получается. »

Microsoft считает использование cmd - атавизмом.

Разработка cmd.exe была фактически остановлена после выхода Windows 2000.В качестве основной командной оболочки рассматривается PowerShell.

PowerShell заменяет командную строку(за ссылку спасибо YuS_2)

Цитата:

Цитата Foreigner
Это так не работает. В строке нет последвательности символов "`r`n" »

Прекрасно все работает, и последовательность символов "`r`n" очень даже есть. Вы код пробовали запустить?)
А у ateka код не запустился потому, что потерял кавычки.

Цитата:

Цитата ateka
С пошиком проблема в том что МС накрутила ограничений на скрипты очень много. »

Цитата:

Цитата ateka
что бы ПоШ из батника заработал? »

Вбейте в яндекс "как запускать ps скрипты", и в первой-второй ссылке будет нужная информация. У меня проблем нет никаких :)

Foreigner 17-06-2020 21:34 2925371

Цитата:

Цитата Fors1k
Прекрасно все работает »

Что там работает? Пустое выражение -- нет вхождения, нет замены. Иначе вместо каждого перевода строки было бы два символа '\' и 'n' Пример замены:
Код:

  > $a =
      : @"
      : a
      : a
      : a
      : "@

 > $a -replace "\n\r", "\n"
a                               
a                               
a                               
 > $a -replace "\n", "\n" 
a\na\na


Fors1k 17-06-2020 22:00 2925378

Цитата:

Цитата Foreigner
Что там работает? »

Я еще раз предлагаю вам запустить мой код, а не свой. А уже после скажете, работает мой код, или нет.

Foreigner 17-06-2020 22:14 2925380

Цитата:

Цитата Fors1k
Я еще раз предлагаю вам запустить мой код, а не свой. А уже после скажете, работает мой код, или нет. »

Почему тогда "`r`n" не меняются на строку "\" + "n"? Ведь так должно быть? Или как? Ну попробуйте в вашем примере другую замену, и вы увидите, как это работает. Замените любой другой символ на "\n".

ateka 17-06-2020 22:14 2925381

Дяденьки, пачиму не раскрывается переменная?
Код:

$result=(Get-Content .\foo.txt -raw).Replace("`r`n",'\n')
Invoke-RestMethod `
        -Body '{"body": "$result"}'


Foreigner 17-06-2020 22:26 2925385

Цитата:

Цитата Fors1k
Я еще раз предлагаю вам запустить мой код, а не свой. »

Сорри, что-то я тупанул, все нормально, строка меняется на строку, бывает. Извиняйте, ввели в заблуждение "`n`r" и "\n".

Fors1k 17-06-2020 22:47 2925388

Foreigner, ничего, бывает)

megaloman 18-06-2020 08:19 2925422

Цитата:

Цитата ateka
Мой файл на 65000 символов. »

В рамках чистого CMD Ваша задача решения не имеет -Ограничение командной строки .
Вот CMD-решение, но в указанных ограничениях.
Код:

@Echo OFF
cls
 
Set "FileIn=Z:\Box_In\test.txt"

Set "Var="
FOR /F "usebackq tokens=1* delims=:" %%i IN (`FINDSTR /N /R /C:".*" "%FileIn%"`) DO Call Set "Var=%%Var%%%%j\n"

Echo "%Var%"
Pause
Exit /B

В чём задача? Зачем такая переменная, что Вы с ней будете делать? Конечный результат - текстовый файл? И чтобы всё остальное - CMD? В такой постановке можно попробовать комбинацию CMD+PowerShell или
CMD+JS
Код:

@set @E=1; /*

@Echo Off
cls
        Set "FileIn=Z:\Box_In\test.txt"
        Set "FileOut=Z:\Box_Out\testOut.txt"

        2>nul del "%FileOut%"
        Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn:\=\\%" "%FileOut:\=\\%"

        More "%FileOut%"
pause
GoTo :Eof

*/

var oArg = WScript.Arguments;
if (oArg.Count()<2) WScript.Quit(1);

var FileIn = oArg(0);
var FileOut = oArg(1);

var FSO = WScript.CreateObject('Scripting.FileSystemObject');

var F = FSO.OpenTextFile(FileIn, 1);
var s = F.ReadAll();
F.Close();

F = FSO.CreateTextFile(FileOut, true);
F.Write(s.replace(new RegExp(String.fromCharCode(13,10), 'g'),"\\n"));
F.Close();

С файлом в 1Мб расправляется мигом.

ateka 18-06-2020 16:29 2925462

Цитата:

Цитата megaloman
delims=: »

Спасибо. Я не подумал поставить : делимом и как дурак отрезал от переменной.
Будет мне наука.
Цитата:

Цитата megaloman
В чём задача? Зачем такая переменная? »

Мне надо взять данные из текстового файла и через API в виде json-a переслать на сайт.
В итоге я взял кусок кода у Форсика, засел за гугл и набросал рабочий код на PoSh.
Надеюсь никому его показывать не придётся.
Ещё раз спасибо!


Время: 21:26.

Время: 21:26.
© OSzone.net 2001-