Приготовьте "!" к началу первой строки файла

88
7

У меня есть несколько файлов, которые мне нужно добавить "!" к началу, только на первой строке. Мне все равно нужно сохранить содержимое первой строки, просто добавьте "!" как первый символ.


Любая помощь будет действительно оценена.


Спасибо!


Изменить:
Единственное, что я мог выяснить до сих пор, это сделать следующее:


$a = Get-Content 'hh_Regulars3.csv'
$b = '!'
Set-Content 'hh_Regulars3-new.csv' -value $b,$a

Это просто добавило "!" в начало файла, а не в начало первой строки.

спросил(а) 2021-01-25T18:34:39+03:00 4 месяца, 2 недели назад
1
Решение
131

Вы отправили массив в Set-Content с помощью $b,$a. Каждому элементу массива будет предоставлена ​​собственная строка, как вы видели. Он будет отображаться таким же образом в приглашении, если будет выполнен.


Пока файл не слишком большой, прочитайте его как одну строку и добавьте символ.


$path = 'hh_Regulars3.csv'
"!" + (Get-Content $path -Raw) | Set-Content $path

Если у вас есть только PowerShell 2.0, то Out-String будет работать вместо -Raw

"!" + (Get-Content $path | Out-String) | Set-Content $path

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


Если файл больше, используйте StreamReader и StreamWriter s. Это также необходимо использовать, если новая новая строка, созданная Add-Content и Set-Content, не является гарантией.

ответил(а) 2021-01-25T18:34:39+03:00 4 месяца, 2 недели назад
45

Этот oneliner может работать:


get-ChildItem *.txt | % { [System.Collections.ArrayList]$lines=Get-Content $_;
$lines[0]=$lines[0].Insert(0,"!") ;
Set-Content "new_$($_.name)" -Value $lines}

ответил(а) 2021-01-25T18:34:39+03:00 4 месяца, 2 недели назад
45

Поздно к партии, но подумал, что это может быть полезно. Мне нужно было выполнить операцию над тысячей + больших файлов и потребовалось нечто более надежное и менее подверженное исключениям OOM. Закончилось, просто написав это, используя библиотеки .Net:


function PrependTo-File{
[cmdletbinding()]
param(
[Parameter(
Position=1,
ValueFromPipeline=$true,
Mandatory=$true,
ValueFromPipelineByPropertyName=$true
)]
[System.IO.FileInfo]
$file,
[string]
[Parameter(
Position=0,
ValueFromPipeline=$false,
Mandatory=$true
)]
$content
)

process{
if(!$file.exists){
write-error "$file does not exist";
return;
}
$filepath = $file.fullname;
$tmptoken = (get-location).path + "\_tmpfile" + $file.name;
write-verbose "$tmptoken created to as buffer";
$tfs = [System.io.file]::create($tmptoken);
$fs = [System.IO.File]::Open($file.fullname,[System.IO.FileMode]::Open,[System.IO.FileAccess]::ReadWrite);
try{
$msg = $content.tochararray();
$tfs.write($msg,0,$msg.length);
$fs.position = 0;
$fs.copyTo($tfs);
}
catch{
write-verbose $_.Exception.Message;
}
finally{

$tfs.close();
# close calls dispose and gc.supressfinalize internally
$fs.close();
if($error.count -eq 0){
write-verbose ("updating $filepath");
[System.io.File]::Delete($filepath);
[System.io.file]::Move($tmptoken,$filepath);
}
else{
$error.clear();
write-verbose ("an error occured, rolling back. $filepath not effected");
[System.io.file]::Delete($tmptoken);
}
}
}
}

Использование:


PS> get-item fileName.ext | PrependTo-File "contentToAdd`r`n"

ответил(а) 2021-01-25T18:34:39+03:00 4 месяца, 2 недели назад
45

Попробуйте следующее:


$a = get-content "c:\yourfile.csv"
$a | %{ $b = "!" + $a ; $b | add-content "c:\newfile.csv" }

ответил(а) 2021-01-25T18:34:39+03:00 4 месяца, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема