2016-03-02 4 views
3

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

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

Спасибо!

Edit: Единственное, что я мог понять, до сих пор было сделать следующее: «!»

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

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

ответ

7

Вы послали массив 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 s и StreamWriter s. Это также необходимо использовать, если новая новая линия, созданная Add-Content и Set-Content, не является оправданной.

+0

Это сработало! Спасибо! – thomaskessel

+1

'Set-Content' добавит дополнительную строку в конец файла. – PetSerAl

+0

@PetSerAl Обычно я не рекомендую, но добавил небольшую заметку об этом. – Matt

0

Попробуйте это:

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

что добавил, но добавил все содержимое на отдельные линии с! предшествующий этому. – thomaskessel

+1

oops, мой плохой. Я неправильно прочитал этот вопрос. Рад, что вы нашли решение. – JayCee

0

Это Oneliner мощь работает:

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

Late к партии, но думал, что это может быть полезно. Мне нужно было выполнить операцию над тысячей + больших файлов и потребовалось нечто более надежное и менее подверженное исключениям 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" 
Смежные вопросы