Я работаю в R (в ОС Windows), пытаясь подсчитать количество слов в текстовом файле, не загружая файл в память. Идея состоит в том, чтобы получить некоторую статистику по размеру файла, количеству строк, количеству слов и т. д. Вызов функции R system (), которая использует find для подсчета строк, найти несложно:
Как выполнить команду «подсчет слов» в командной строке Windows
lineCount <- system(paste0('find /c /v "" ', path), intern = T)
Команда, с которой я пытаюсь работать для подсчета слов, - это команда PowerShell: Measure-Object. Я могу запустить следующий код, не вызывая ошибки, но он возвращает неправильный счетчик.
print(system2("Measure-Object", args = c('count_words.txt', '-Word')))
[1] 127
Файл count_words.txt содержит порядка миллионов слов. Я также протестировал его на файле .txt с гораздо меньшим количеством слов.
"There are seven words in this file."
Но счет снова возвращается как 127.
print(system2("Measure-Object", args = c('seven_words.txt', '-Word')))
[1] 127
Распознает ли system2() команды PowerShell? Каков правильный синтаксис вызова функции при использовании Measure-Object? Почему он возвращает одно и то же значение независимо от фактического количества слов?





Итак, у вас есть две проблемы:
system2() использовать powershellcommand <- "Get-Content C:/Users/User/Documents/test1.txt | Measure-Object -Word"
system2("powershell", args = command)
где вы заменяете C:/Users/User/Documents/test2.txt на любой путь к вашему файлу. Я создал два файла .txt, один с текстом «В этом файле семь слов». а другой с текстом «Но в этом файле восемь слов». Затем я запустил в R следующее:
command <- "Get-Content C:/Users/User/Documents/test1.txt | Measure-Object -Word"
system2("powershell", args = command)
Lines Words Characters Property
----- ----- ---------- --------
7
command <- "Get-Content C:/Users/User/Documents/test2.txt | Measure-Object -Word"
system2("powershell", args = command)
Lines Words Characters Property
----- ----- ---------- --------
8
Из help("system2"):
system2 invokes the OS command specified by command.
Одна из основных проблем заключается в том, что Measure-Object - это не системная команда, а команда PowerShell. Системная команда для PowerShell - powershell, которую вам и нужно вызвать.
Кроме того, у вас не совсем правильный синтаксис PowerShell. Если вы посмотрите на документы, вы увидите команду PowerShell, которая вам действительно нужна:
Get-Content C:/Users/User/Documents/count_words.txt | Measure-Object -Word
(посмотрите пример три в связанной документации).