PowerShell에서 한 줄씩 파일 읽기
PowerShell에서 파일을 한 줄씩 읽고 싶다.구체적으로는 파일을 루프하여 각 행을 루프 내의 변수에 저장하고 해당 라인에서 처리를 수행합니다.
나는 Bash에 상당하는 것을 안다.
while read line do
if [[ $line =~ $regex ]]; then
# work here
fi
done < file.txt
PowerShell 루프에 대한 문서가 많지 않습니다.
PowerShell 루프에 대한 문서가 많지 않습니다.
PowerShell의 루프에 대한 설명서는 풍부하며, , , , , , , 등의 도움말 항목을 확인하는 것이 좋습니다.
foreach($line in Get-Content .\file.txt) {
if($line -match $regex){
# Work here
}
}
이 문제에 대한 또 다른 관용적인 PowerShell 솔루션은 텍스트 파일의 행을 cmdlet에 연결하는 것입니다.
Get-Content .\file.txt | ForEach-Object {
if($_ -match $regex){
# Work here
}
}
루프 내에서 regex를 대조하는 대신, 관심 있는 라인만 필터링할 수 있습니다.
Get-Content .\file.txt | Where-Object {$_ -match $regex} | ForEach-Object {
# Work here
}
Get-Content
퍼포먼스가 나빠서 파일을 한 번에 메모리에 읽으려고 합니다.
C#(.NET) 파일 리더는 각 행을 하나씩 읽습니다.
최고의 퍼포먼스
foreach($line in [System.IO.File]::ReadLines("C:\path\to\file.txt"))
{
$line
}
또는 퍼포먼스가 약간 떨어짐
[System.IO.File]::ReadLines("C:\path\to\file.txt") | ForEach-Object {
$_
}
그foreach
진술이 보다 약간 더 빠를 것 같다ForEach-Object
(자세한 것은, 이하의 코멘트를 참조해 주세요).
대용량 파일 한 줄씩 읽기
Original Comment (1/2021) 4GB 로그 파일을 50초 만에 읽을 수 있었습니다.PowerShell을 사용하여 동적으로 C# 어셈블리로 로드하면 속도를 높일 수 있습니다.
[System.IO.StreamReader]$sr = [System.IO.File]::Open($file, [System.IO.FileMode]::Open)
while (-not $sr.EndOfStream){
$line = $sr.ReadLine()
}
$sr.Close()
부록 (2022년 3월) PowerShell에 내장된 C#을 사용하여 대용량 파일을 처리하는 것이 훨씬 빠르고 "가져오기"가 적습니다.
$code = @"
using System;
using System.IO;
namespace ProcessLargeFile
{
public class Program
{
static void ProcessLine(string line)
{
return;
}
public static void ProcessLogFile(string path) {
var start_time = DateTime.Now;
StreamReader sr = new StreamReader(File.Open(path, FileMode.Open));
try {
while (!sr.EndOfStream){
string line = sr.ReadLine();
ProcessLine(line);
}
} finally {
sr.Close();
}
var end_time = DateTime.Now;
var run_time = end_time - start_time;
string msg = "Completed in " + run_time.Minutes + ":" + run_time.Seconds + "." + run_time.Milliseconds;
Console.WriteLine(msg);
}
static void Main(string[] args)
{
ProcessLogFile("c:\\users\\tasaif\\fake.log");
Console.ReadLine();
}
}
}
"@
Add-Type -TypeDefinition $code -Language CSharp
PS C:\Users\tasaif> [ProcessLargeFile.Program]::ProcessLogFile("c:\\users\\tasaif\\fake.log")
Completed in 0:17.109
전능하신 분은 여기서 잘 일하십니다.
'one
two
three' > file
$regex = '^t'
switch -regex -file file {
$regex { "line is $_" }
}
출력:
line is two
line is three
Set-Location 'C:\files'
$files = Get-ChildItem -Name -Include *.txt
foreach($file in $files){
Write-Host("Start Reading file: " + $file)
foreach($line in Get-Content $file){
Write-Host($line)
}
Write-Host("End Reading file: " + $file)
}
언급URL : https://stackoverflow.com/questions/33511772/read-file-line-by-line-in-powershell
'IT' 카테고리의 다른 글
UILabel의 NSAttributedString에 탭 가능한 "링크"를 작성하시겠습니까? (0) | 2023.04.18 |
---|---|
Git에서 분기 토폴로지를 시각화하는 중 (0) | 2023.04.18 |
PowerShell을 사용하여 파일에서 읽기 전용 속성을 삭제하는 방법 (0) | 2023.04.18 |
★★★★★★★★★★★★★★★★★」 ★★★★★★★★★★★★★★★★★」 ★★★★★★★★★★★★★★★★★」? (0) | 2023.04.18 |
커스텀 루티드명령어를 WPF에 추가하려면 어떻게 해야 하나요? (0) | 2023.04.18 |