Показать полную графическую версию : [решено] Перенос символов на новую строку из текстового вайла
angel_lyucifer
31-05-2017, 17:41
Привет всем.
Нужна ваша помощь, у меня есть файл текстовый, в нем есть строка количество символов может быть любым как русские так и английские символы.
Нужно создать скрипт который бы эту строчку в файле делил на символы и каждый символ переносил на новую строку, например строка "таракан" эту строчку нужно сделать так:
т
а
р
а
к
а
н
И сохранить файл. Заранее благодарю.
у меня есть файл текстовый »
Образец файла упакуйте в архив и приложите к сообщению, либо выложите на RGhost или Яндекс.Диск.
в нем есть строка »
По какому признаку мы сможем выделить эту строку среди прочих строк?
greg zakharov
31-05-2017, 18:52
(function(file, enc) { // enc Default = -2, Unicode = -1, ASCII = 0
var f = null, arr = [];
with (new ActiveXObject('Scripting.FileSystemObject')) {
try {
f = OpenTextFile(file, 1, false, enc);
while (!f.AtEndOfStream) {
arr.push(f.ReadLine().split('').join('\n'));
}
f.Close();
f = OpenTextFile(file, 2, false, enc);
f.Write(arr.join('\n'));
}
catch (e) { WScript.echo(e.message); }
finally {
if (f !== null) f.Close();
}
}
})(
WScript.Arguments.length !== 2 ?
(function() {
WScript.echo('Синтаксис: ' + WScript.ScriptName + ' <файл кодировка>\n' +
'.e.g.: C:\\> cscript ' + WScript.ScriptName + ' file.txt 0'
);
WScript.Quit(1);
})() : WScript.Arguments.Unnamed(0), WScript.Arguments.Unnamed(1)
);
angel_lyucifer
31-05-2017, 20:32
По какому признаку мы сможем выделить эту строку среди прочих строк? »
Там одна строка.
angel_lyucifer, тогда просто воспользуйтесь кодом, предложенным коллегой greg zakharov, только замените в двух местах '\n' на '\r\n', иначе получите концы строк в формате Unix. Это JScript.
greg zakharov
31-05-2017, 22:31
Iska, для одной единственной строки использовать коды выше... как-то однако. Этот код мной был накидан исходя из соображений, что в файле может быть несколько строк (вызов функции ReadLine по достижении окончания файла). Но раз файл представляет из себя однострочник, цикл следует выкинуть, да и код можно значительно ужать. А если бы автор темы пользовался Vim, вся его задача сводилась бы к команде:
vim -c "%s/\(.\)/\1\n\r/g" -c exit file.txt
angel_lyucifer
31-05-2017, 23:14
vim -c "%s/\(.\)/\1\n\r/g" -c exit file.txt »
Как данную команду внедрить в файл bat?
Iska, для одной единственной строки использовать коды выше... как-то однако. »
Ну, дык, работает? Работает :).
Но раз файл представляет из себя однострочник, цикл следует выкинуть, да и код можно значительно ужать. »
Можно.
Как данную команду внедрить в файл bat? »
Никак. У Вас нет vim.
greg zakharov
01-06-2017, 09:36
И отчего уверенность в том, что все начнется с WSH, но в итоге будет подведено к bat, не покадала меня с самого начала?
Iska, в идеале вообще было бы здорово отказаться от архаичного WSH, в пользу какого-нибудь интерпретируемого языка или технологии вроде NodeJS. Последний, к слову, в виду своей переносимости и единофайловой сущности (один единственный экзешник) для операций чтения\записи с\на диск(а)? очень даже ничего. Однако, в виду штатности PowerShell (начиная с Win7) проще использовать последний, ибо решением будет нечто вроде:
(Get-Content file.txt).ToCharArray() | Out-File file.txt -Encoding Default
angel_lyucifer, как заметин Iska, Vim не является штатным текстовым процессором, поэтому если у Вас возникло желание воспользоваться приведенным решением, нужно позаботиться прежде об установке\сборке из исходников Vim самостоятельно. От себя же могу добавить еще несколько примеров решения Вашей задачи. Например, grep (есть порт под Windows):
grep -o . file.txt > tmp.txt
move /y tmp.txt file.txt
Или сам командный язык Windows:
@echo off
setlocal enabledelayedexpansion
set "i=0"
@<file.txt (for /f "delims=" %%i in ('more') do set "s=%%i")
:loop
set "c=!s:~%i%,1!"
if /i "!c!" neq "" echo.!c!>>file.txt:s&set /a "i+=1"&goto:loop
more < file.txt:s > foo
endlocal
exit /b
Вообще, решений у задачи великое множество, в том числе и штатными средствами, доступными практически в каждой версии Windows. Личным же выбором в данном случае был бы Vim или Perl.
И отчего уверенность в том, что все начнется с WSH, но в итоге будет подведено к bat, не покадала меня с самого начала? »
Шаман, однако!
Iska, в идеале вообще было бы здорово отказаться от архаичного WSH, в пользу какого-нибудь интерпретируемого языка »
В комплекте поставки идут два-три языка: WSH с VBScript и JScript, и, начиная с Vista, PowerShell различных модификаций. При всём богатстве выбора другой альтернативы нет.
или технологии вроде NodeJS. »
Флаг в руки, флаг в руки.
Последний, к слову, в виду своей переносимости и единофайловой сущности (один единственный экзешник) для операций чтения\записи с\на диск(а)? очень даже ничего. »
Уж сколько их упало в эту бездну. Perl и Python, как отдельно, так и входным языком для WSH. Java с грандиозыми планами вселенского масштаба покорения всего и вся. Forth. KiXtart. AutoIt. Что я ещё не упомянул? Lua — новый калиф на час?
greg zakharov
01-06-2017, 11:13
Iska, какой смысл использовать нечто штатное, обязывающее к написанию довольно внушительного кода, когда можно использовать сторонее средство при условии, что не требуется некой унифицированность? Может Node как технология и не самая лучшая, но пока что только благодаря ей мне удалось с малым количеством телодвижений запустить PowerShell в браузере (это было необходимо для реализации интерактивно-удаленного обучения некоторых админов). То же и прочие технологии. Правда по части Python'а и Perl'а правда такова, что добрая часть инфраструктуры Linux зиждется именно на них, а то, что PowerShell претендует на звание кроссплатформенной технологии почитателями юниксподобных систем воспринимается с насмешкой. Следовательно, скептически можно относиться ко всему угодно, ибо не существует ни одной такой технологии, способной решить всякую без исключения задачу, а если учесть что время является одним из ключевых факторов в решении задач, то решение последних с минимальными затратами и обуславливает в конечном итоге выбор технологии\платформы\языка. Понимаете, все это риторика, не более.
Iska, какой смысл использовать нечто штатное, обязывающее к написанию довольно внушительного кода, когда можно использовать сторонее средство при условии, что не требуется некой унифицированность? »
Именно если не требуется. Тут я с Вами вполне соглашусь — бери то, что знаешь, то, что наилучшим образом соответствует поставленной задаче, и пользуй. Конкретный язык — всего лишь средство.
В противном же случае… Тот же PowerShell. Ладно, когда от версии к версии наблюдается различное поведение, но вот, когда в рамках одной и той же версии на разных платформах разное поведение — это уже перебор. Помните, как у нас с Вами на SCI такое наблюдалось — одна и та же версия 2.0, с одной и той же версией .Net, у Вас под Windows 7, а у меня под Windows XP один и тот же код давал разные результаты, и мы спорили, нужен ли там [void] перед результатом (или |Out-Null — после)?
а если учесть что время является одним из ключевых факторов в решении задач, »
Для определённого класса задач. В задачах администрирования, напротив, главное — не время, а предсказуемость поведения. Ибо, конечно, это не опечатка в учебнике по химии™, но всё же, всё же, всё же…
Понимаете, все это риторика, не более. »
Само собой :).
greg zakharov
01-06-2017, 15:13
...и мы спорили...Если бы мы не спорили, то не было бы сделано верных выводов касательно тех или иных странностей. Впрочем, все относительно. Тем не менее, считаю что наши с Вами соображения конструктивны, а объединение усилий вполне бы могло стать залогом некого большего IT-проекта. Но мы уже достаточно наофтопили, пожалуй, пора и честь знать :)
Ну, завсегда может прийти лесник и раздать всем сестра́́м по серьга́́м.
angel_lyucifer
01-06-2017, 22:56
@echo off setlocal enabledelayedexpansion set "i=0" @<file.txt (for /f "delims=" %%i in ('more') do set "s=%%i") :loop set "c=!s:~%i%,1!" if /i "!c!" neq "" echo.!c!>>file.txt:s&set /a "i+=1"&goto:loop more < file.txt:s > foo endlocal exit /b »
Спасибо за скрипт, это то что нужно... :yahoo: :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.