Компьютерный форум 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=327227)

angel_lyucifer 31-05-2017 17:41 2741111

Перенос символов на новую строку из текстового вайла
 
Привет всем.
Нужна ваша помощь, у меня есть файл текстовый, в нем есть строка количество символов может быть любым как русские так и английские символы.
Нужно создать скрипт который бы эту строчку в файле делил на символы и каждый символ переносил на новую строку, например строка "таракан" эту строчку нужно сделать так:
т
а
р
а
к
а
н
И сохранить файл. Заранее благодарю.

Iska 31-05-2017 18:36 2741128

Цитата:

Цитата angel_lyucifer
у меня есть файл текстовый »

Образец файла упакуйте в архив и приложите к сообщению, либо выложите на RGhost или Яндекс.Диск.

Цитата:

Цитата angel_lyucifer
в нем есть строка »

По какому признаку мы сможем выделить эту строку среди прочих строк?

greg zakharov 31-05-2017 18:52 2741132

Код:

(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 2741155

Вложений: 1
Цитата:

Цитата Iska
По какому признаку мы сможем выделить эту строку среди прочих строк? »

Там одна строка.

Iska 31-05-2017 21:17 2741167

angel_lyucifer, тогда просто воспользуйтесь кодом, предложенным коллегой greg zakharov, только замените в двух местах '\n' на '\r\n', иначе получите концы строк в формате Unix. Это JScript.

greg zakharov 31-05-2017 22:31 2741203

Iska, для одной единственной строки использовать коды выше... как-то однако. Этот код мной был накидан исходя из соображений, что в файле может быть несколько строк (вызов функции ReadLine по достижении окончания файла). Но раз файл представляет из себя однострочник, цикл следует выкинуть, да и код можно значительно ужать. А если бы автор темы пользовался Vim, вся его задача сводилась бы к команде:
Код:

vim -c "%s/\(.\)/\1\n\r/g" -c exit file.txt

angel_lyucifer 31-05-2017 23:14 2741210

Цитата:

Цитата greg zakharov
vim -c "%s/\(.\)/\1\n\r/g" -c exit file.txt »

Как данную команду внедрить в файл bat?

Iska 01-06-2017 03:41 2741230

Цитата:

Цитата greg zakharov
Iska, для одной единственной строки использовать коды выше... как-то однако. »

Ну, дык, работает? Работает :).

Цитата:

Цитата greg zakharov
Но раз файл представляет из себя однострочник, цикл следует выкинуть, да и код можно значительно ужать. »

Можно.

Цитата:

Цитата angel_lyucifer
Как данную команду внедрить в файл bat? »

Никак. У Вас нет vim.

greg zakharov 01-06-2017 09:36 2741260

И отчего уверенность в том, что все начнется с 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.

Iska 01-06-2017 10:33 2741281

Цитата:

Цитата greg zakharov
И отчего уверенность в том, что все начнется с WSH, но в итоге будет подведено к bat, не покадала меня с самого начала? »

Шаман, однако!

Цитата:

Цитата greg zakharov
Iska, в идеале вообще было бы здорово отказаться от архаичного WSH, в пользу какого-нибудь интерпретируемого языка »

В комплекте поставки идут два-три языка: WSH с VBScript и JScript, и, начиная с Vista, PowerShell различных модификаций. При всём богатстве выбора другой альтернативы нет.

Цитата:

Цитата greg zakharov
или технологии вроде NodeJS. »

Флаг в руки, флаг в руки.

Цитата:

Цитата greg zakharov
Последний, к слову, в виду своей переносимости и единофайловой сущности (один единственный экзешник) для операций чтения\записи с\на диск(а)? очень даже ничего. »

Уж сколько их упало в эту бездну. Perl и Python, как отдельно, так и входным языком для WSH. Java с грандиозыми планами вселенского масштаба покорения всего и вся. Forth. KiXtart. AutoIt. Что я ещё не упомянул? Lua — новый калиф на час?

greg zakharov 01-06-2017 11:13 2741292

Iska, какой смысл использовать нечто штатное, обязывающее к написанию довольно внушительного кода, когда можно использовать сторонее средство при условии, что не требуется некой унифицированность? Может Node как технология и не самая лучшая, но пока что только благодаря ей мне удалось с малым количеством телодвижений запустить PowerShell в браузере (это было необходимо для реализации интерактивно-удаленного обучения некоторых админов). То же и прочие технологии. Правда по части Python'а и Perl'а правда такова, что добрая часть инфраструктуры Linux зиждется именно на них, а то, что PowerShell претендует на звание кроссплатформенной технологии почитателями юниксподобных систем воспринимается с насмешкой. Следовательно, скептически можно относиться ко всему угодно, ибо не существует ни одной такой технологии, способной решить всякую без исключения задачу, а если учесть что время является одним из ключевых факторов в решении задач, то решение последних с минимальными затратами и обуславливает в конечном итоге выбор технологии\платформы\языка. Понимаете, все это риторика, не более.

Iska 01-06-2017 12:26 2741314

Цитата:

Цитата greg zakharov
Iska, какой смысл использовать нечто штатное, обязывающее к написанию довольно внушительного кода, когда можно использовать сторонее средство при условии, что не требуется некой унифицированность? »

Именно если не требуется. Тут я с Вами вполне соглашусь — бери то, что знаешь, то, что наилучшим образом соответствует поставленной задаче, и пользуй. Конкретный язык — всего лишь средство.

В противном же случае… Тот же PowerShell. Ладно, когда от версии к версии наблюдается различное поведение, но вот, когда в рамках одной и той же версии на разных платформах разное поведение — это уже перебор. Помните, как у нас с Вами на SCI такое наблюдалось — одна и та же версия 2.0, с одной и той же версией .Net, у Вас под Windows 7, а у меня под Windows XP один и тот же код давал разные результаты, и мы спорили, нужен ли там [void] перед результатом (или |Out-Null — после)?

Цитата:

Цитата greg zakharov
а если учесть что время является одним из ключевых факторов в решении задач, »

Для определённого класса задач. В задачах администрирования, напротив, главное — не время, а предсказуемость поведения. Ибо, конечно, это не опечатка в учебнике по химии™, но всё же, всё же, всё же…

Цитата:

Цитата greg zakharov
Понимаете, все это риторика, не более. »

Само собой :).

greg zakharov 01-06-2017 15:13 2741352

Цитата:

Цитата Iska
...и мы спорили...

Если бы мы не спорили, то не было бы сделано верных выводов касательно тех или иных странностей. Впрочем, все относительно. Тем не менее, считаю что наши с Вами соображения конструктивны, а объединение усилий вполне бы могло стать залогом некого большего IT-проекта. Но мы уже достаточно наофтопили, пожалуй, пора и честь знать :)

Iska 01-06-2017 15:39 2741363

Ну, завсегда может прийти лесник и раздать всем сестра́́м по серьга́́м.

angel_lyucifer 01-06-2017 22:56 2741471

Цитата:

Цитата greg zakharov
@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: :)


Время: 15:09.

Время: 15:09.
© OSzone.net 2001-