Войти

Показать полную графическую версию : Необходимо прочитать и сериализовать текстовый файл в переменную


ateka
17-06-2020, 14:41
Здравствуйте, ищу помощи в с следующей задачей:
Есть текстовый файл с строками:
зайка
котик
ослик

тигрёнок

бабочка
Пытаюсь преобразовать его в 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
param(
$path="C:\qwe.txt"
)cls

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

Foreigner
17-06-2020, 18:23
Fors1k, а зачем ты пишешь cls после блока param? Не могу этого понять, зачем?

Fors1k
17-06-2020, 18:35
до161731
после:161732
cls обеспечивает чистоту и свежий запах в консоли после выполнения кода :)

ateka
17-06-2020, 18:52
$result »
С пошиком проблема в том что МС накрутила ограничений на скрипты очень много.
Пока запустишь - уже не надо.
А так конечно спасибо. У меня локально работает.
Правда на большом файле (65к) ещё не проверял.

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
cls обеспечивает чистоту и свежий запах в консоли после выполнения кода »
Понятно, просто для читаемости.

ateka
17-06-2020, 20:18
С 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
ateka, ему не надо «работать из батника».

Foreigner
17-06-2020, 20:51
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
С CMD у меня не получается. »Microsoft считает использование cmd - атавизмом.

Разработка cmd.exe была фактически остановлена после выхода Windows 2000.В качестве основной командной оболочки рассматривается PowerShell. (https://ru.wikipedia.org/wiki/Cmd.exe)

PowerShell заменяет командную строку (https://support.microsoft.com/ru-ru/help/4027690/windows-powershell-is-replacing-command-prompt)(за ссылку спасибо YuS_2)

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

С пошиком проблема в том что МС накрутила ограничений на скрипты очень много. »что бы ПоШ из батника заработал? »
Вбейте в яндекс "как запускать ps скрипты", и в первой-второй ссылке будет нужная информация. У меня проблем нет никаких :)

Foreigner
17-06-2020, 21:34
Прекрасно все работает »
Что там работает? Пустое выражение -- нет вхождения, нет замены. Иначе вместо каждого перевода строки было бы два символа '\' и '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
Что там работает? »
Я еще раз предлагаю вам запустить мой код, а не свой. А уже после скажете, работает мой код, или нет.

Foreigner
17-06-2020, 22:14
Я еще раз предлагаю вам запустить мой код, а не свой. А уже после скажете, работает мой код, или нет. »

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

ateka
17-06-2020, 22:14
Дяденьки, пачиму не раскрывается переменная?

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

Foreigner
17-06-2020, 22:26
Я еще раз предлагаю вам запустить мой код, а не свой. »
Сорри, что-то я тупанул, все нормально, строка меняется на строку, бывает. Извиняйте, ввели в заблуждение "`n`r" и "\n".

Fors1k
17-06-2020, 22:47
Foreigner, ничего, бывает)

megaloman
18-06-2020, 08:19
Мой файл на 65000 символов. »В рамках чистого CMD Ваша задача решения не имеет -Ограничение командной строки . (https://support.microsoft.com/ru-ru/help/830473/command-prompt-cmd-exe-command-line-string-limitation)@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 или @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
delims=: »
Спасибо. Я не подумал поставить : делимом и как дурак отрезал от переменной.
Будет мне наука.
В чём задача? Зачем такая переменная? »
Мне надо взять данные из текстового файла и через API в виде json-a переслать на сайт.
В итоге я взял кусок кода у Форсика, засел за гугл и набросал рабочий код на PoSh.
Надеюсь никому его показывать не придётся.
Ещё раз спасибо!




© OSzone.net 2001-2012