PowerShell: как посчитать количество строк в CSV-файле? - PullRequest
19 голосов
/ 28 июля 2011

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

Get-Content -length "C:\Directory\file.csv"

или

(Get-Content).length "C:\Directory\file.csv"

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

Ответы [ 6 ]

37 голосов
/ 21 декабря 2012

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, чтобы получить количество строк в файле.

28 голосов
/ 28 июля 2011

Передайте это командлету Measure-Object

Import-Csv C:\Directory\file.csv | Measure-Object
7 голосов
/ 28 июля 2011

Обычно (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
0 голосов
/ 17 марта 2019

Вы можете просто использовать Unix как Comand в PowerShell.

Если вы подаете test.csv Тогда команда для получения количества строк:

gc test.csv | Measure-Object
0 голосов
/ 05 ноября 2013

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

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

0 голосов
/ 13 июня 2013

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

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

или

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