PowerShell: как подсчитать количество строк в csv-файле?

Как подсчитать количество строк в csv-файле с помощью powershell? Я попробовал что-то вроде

Get-Content -length "C:Directoryfile.csv"

или

(Get-Content).length "C:Directoryfile.csv"

но это приводит к ошибке.

5 ответов


трубы к


Get-Content и Measure-Object хороши для небольших файлов, но оба они очень неэффективны с памятью. У меня были реальные проблемы с большими файлами.

при подсчете строк в файле 1 ГБ с помощью любого метода Powershell проглотил всю доступную память на сервере (8 ГБ), а затем начал подкачку на диск. Я оставил его более часа, но он все еще был на диске, поэтому я убил его.

лучший метод, который я нашел для больших файлов, - использовать IO.StreamReader для загрузки файла с диска и подсчитайте каждую строку с помощью переменной. Это позволяет использовать память до очень разумного 25 МБ и намного быстрее, занимая около 30 секунд для подсчета строк в файле 1 ГБ или пару минут для файла 6 ГБ. Он никогда не съедает необоснованное количество ОЗУ, независимо от того, насколько велик ваш файл:

[int]$LinesInFile = 0
$reader = New-Object IO.StreamReader 'c:\filename.csv'
 while($reader.ReadLine() -ne $null){ $LinesInFile++ }

приведенный выше фрагмент может быть вставлен везде, где вы используете get-content или measure-object, просто обратитесь к переменной $LinesInFile, чтобы получить количество строк файла.


вообще (csv или нет)

@(Get-Content c:\file.csv).Length

если файл имеет только одну строку, то он завершится ошибкой. (требуется префикс@...в противном случае, если файл имеет одну строку, он будет считать только число символы в этой строке.

Get-Content c:\file.csv | Measure-Object -line

но оба потерпят неудачу, если любая запись занимает более одной строки. Тогда лучше импортировать csv и измерить:

Import-Csv c:\file.csv | Measure-Object | Select-Object -expand count

Вы можете попробовать

(Import-Csv C:\Directory\file.csv).count

или

$a=Import-Csv C:\Directory\file.csv
$a.count

(Import-Csv C:\Directory\file.csv).count является единственным точным из них.

Я пробовал все другие предложения в csv с 4781 строками, и все, кроме этого, вернули 4803.