Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Построчное чтение файла и работа с элементами строки

Ответить
Настройки темы
PowerShell - Построчное чтение файла и работа с элементами строки

Новый участник


Сообщения: 1
Благодарности: 0

Профиль | Отправить PM | Цитировать


Здравствуйте! Никак не получается разобраться: Нужно прочитать текстовый файл, и в каждой строке попарно заменить слова между собой (1-е со 2-м, 3-е с 4-м и т.д)

Отправлено: 11:43, 05-10-2020

 

Аватара для Elven

Ветеран


Сообщения: 992
Благодарности: 268

Профиль | Сайт | Отправить PM | Цитировать


было бы неплохо увидеть пример строки, а еще лучше пример файла.
Ну и так, немного на вентилятор:
чем разделяются "слова";
что делать если количество слов в строке нечетное;
какая кодировка у файла;
чем строки заканчиваются;
куда, наконец, резльтат записывать?
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:38, 05-10-2020 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


По рабоче-крестьянски:
Скрытый текст
Код: Выделить весь код
Get-Content -Path 'C:\Мои проекты\0322\0001.txt' |`
    ForEach-Object -Process {
        $aWords = $_.Split()
        $iCount = $aWords.Count - $aWords.Count % 2

        for($i = 0; $i -lt $iCount; $i = $i + 2) {
            $sWord          = $aWords[$i]
            $aWords[$i]     = $aWords[$i + 1]
            $aWords[$i + 1] = $sWord
        }

        $aWords -join ' '
    }


Полагаю, можно быстрее сделать замену регуляркой.
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:24, 05-10-2020 | #3


Ветеран


Сообщения: 1754
Благодарности: 965

Профиль | Цитировать


Код: Выделить весь код
$text = 'один два три четыре пять' 
$arr = $text.Split()

$n = [Collections.ArrayList] @()

for ($i = 0; $i -lt $arr.Count; $i++)
{
    switch ( $i % 2 )
    {
        1  { $n.Insert(($i-1),$arr[$i]) }
        0  { $n.Insert($i,$arr[$i]) }
    } 
}

$n -join ' '
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:23, 05-10-2020 | #4


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Длина строк (количество слов в строке), как и пунктуация, действительно автором темы не были оговорены. А так можно подбросить решение в "функциональном" стиле.
Код: Выделить весь код
$text = @'
два один четыре три пять
это а длинная просто строка тестовая
'@

$text | ConvertFrom-Csv -Delimiter ' ' -Header (($arr =
  1..($text.Split("`n") | Sort-Object Length -Bottom 1 | Measure-Object -Word).Words
)) | Select-Object -Property ([String[]]$arr.ForEach{$_ + ($_ % 2 -eq 0 ? -1 : 1)}) |
ConvertTo-Csv -Delimiter ' ' -UseQuotes 0 | Select-Object -Skip 1
Что касается скорости и текстовых файлов (больших в частности), лучше воспользоваться SQLite.

Последний раз редактировалось greg zakharov, 05-10-2020 в 21:20.


Отправлено: 21:15, 05-10-2020 | #5


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Одно из возможных решений при наличии пунктуации в тексте - токенизация на манер того, как это реализовано в PSParser.
Код: Выделить весь код
@'
каждый И в, вечер назначенный час,
(это Иль снится только мне?)
стан Девичий, схваченный шелками,
туманном В окне движется.

медленно И, меж пройдя пьяными,
без Всегда одна, спутников,
духами Дыша туманами и,
садится Она окна у.
'@.Split("`n").ForEach{
  $i, $str = 0, $_

  $arr = ($str -split '(\p{L}+|\p{P})(?:\s+)?').Where{$_}.ForEach{
    [PSCustomObject]@{
      Type = $_ -match '\p{P}' ? 'Punctuation' : 'Word'
      Index = ++$i
      Value = $_
    }
  }

  $w  = $arr.Where{$_.Type -eq 'Word'}
  $sz = $w.Count % 2 -eq 0 ? $w.Count : $w.Count - 1

  for ($i = 0; $i -lt $sz; $i += 2) {
    $w[$i].Index, $w[$i + 1].Index = $w[$i + 1].Index, $w[$i].Index
  }

  ($w + $arr.Where{$_.Type -eq 'Punctuation'} |
  Sort-Object Index).Value -join ' ' -replace '\s(\p{P})', '$1'
}
При работе с потоками производительность повысится, но не сравнится по скорости с использованием указателей (правда для этого нужно знать опкоды IL, а объяснять каждый из них не хочется, поэтому примера не последует).

Отправлено: 22:39, 10-10-2020 | #6



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Построчное чтение файла и работа с элементами строки

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Построчное чтение файла и запись в другой acefoster Скриптовые языки администрирования Windows 11 28-03-2024 08:02
[решено] Построчное чтение файла в Bash FATruden Программирование в *nix 11 19-05-2017 00:44
VBS/WSH/JS - [решено] Построчное чтение из файла в переменную Elven Скриптовые языки администрирования Windows 10 05-02-2015 16:55
VBS/WSH/JS - [решено] Построчное чтение "большого" файла и замена символов phenoMANon Скриптовые языки администрирования Windows 6 23-08-2013 10:44
CMD/BAT - [решено] Чтение строки из файла в переменную Николя Скриптовые языки администрирования Windows 42 17-01-2010 19:42




 
Переход