2015-02-24 2 views
0

Powershell Сценария для удаления пустых столбцов из CSVPowershell скрипт для удаления пустых столбцов из CSV

У меня есть спред лист, который я импортирую в базу данных MySQL, импорт терпит неудачу из-за пустые столбцы в распространении лист.

Есть ли сценарий powershell, который я могу запустить/создать, который будет проверять любой CSV-файл и удалять пустые столбцы?

Col1, Col2, Col3, COL4 ,,,, Val1, Val2, val3, Val4

+0

Вы должны привести пример того, что у вас есть и что вам нужно. Коротким примером того, что вы проверили, было бы хорошо. – JPBlanc

+0

Пример того, что у меня есть: Col1, Col2, Col3, COL4 ,,,, Val1, Val2, val3, Val4 Пример того, что я хочу: Col1, Col2, Col3, COL4 Val1, Val2, val3, Val4 – James

ответ

1

Как о чем-то вроде этого:

$x = Import-Csv YourFile.csv 
$f = $x[0] | Get-Member -MemberType NoteProperty | Select name 
$f | Add-Member -Name count -Type NoteProperty -Value 0 
$f | %{ 
    $n = $_.Name 
    $_.Count = @($x | Select $n -ExpandProperty $n | ? {$_ -ne ''}).count 
} 
$f = @($f | ? {$_.count -gt 0} | Select Name -expandproperty Name) 

$x | Select $f | Export-Csv NewFile.csv -NoTypeInformation 

Он использует Get-Member, чтобы получить имена столбцов , каждый цикл проверяет, сколько из них не пустое, а затем использует результаты в выборе.

+0

Я получаю несколько сообщений об ошибках: 1. Невозможно обработать аргумент, потому что значение аргумента «имя» недопустимо. Насколько мне известно, это потому, что PS пытается импортировать CSV с пустыми столбцами в конце. После использования вашего ответа: 2. Нельзя индексировать нулевой массив. 3. Add-Member: Невозможно связать аргумент с параметром 'InputObject', потому что он является нулевым. – James

+0

Если ваши файлы не являются допустимыми CSV, тогда вам нужно будет немного сделать предварительную предварительную обработку, чтобы очистить их. Первый шаг заключается в том, чтобы выяснить, почему Powershell не может их загрузить, потому что каждый столбец не имеет уникального заголовка или несколько строк, в которых отсутствуют столбцы, в столбцах содержится текст со встроенными запятыми и без цитирования. Затем вы можете загрузить файл с помощью Get-Content, очистить его, возможно, с помощью regex/replace, а затем преобразовать в объект с помощью ConvertFrom = Csv. Если вы можете добавить пример своего CSV на свой вопрос, я могу помочь вам больше. –

0

Когда я запускаю код Дейва Секстона, я получаю:

Select-Object : Cannot convert System.Management.Automation.PSObject to one of the following 
types {System.String, System.Management.Automation.ScriptBlock}. 
At line:15 char:12 
+ $x | Select <<<< $f | Export-Csv ColsRem.test.$time.csv -NoTypeInformation 
+ CategoryInfo   : InvalidArgument: (:) [Select-Object], NotSupportedException 
+ FullyQualifiedErrorId : 
        DictionaryKeyUnknownType,Microsoft.PowerShell.Commands.SelectObjectCommand 

Я исправил эту проблему, добавив еще одну строку, чтобы заставить каждый элемент массива должен быть строкой.

$x = Import-Csv YourFile.csv 
$f = $x[0] | Get-Member -MemberType NoteProperty | Select name 
$f | Add-Member -Name count -Type NoteProperty -Value 0 
$f | %{ 
    $n = $_.Name 
    $_.Count = @($x | Select $n -ExpandProperty $n | ? {$_ -ne ''}).count 
} 
$f = @($f | ? {$_.count -gt 0} | Select Name -expandproperty Name) 

# I could get the select to work with strings separated by commas, but the array would 
# always produce the error until I added the following line, explicitly changing the 
#values to strings. 
$f = $f | Foreach-Object { "$_" } 

$x | Select $f | Export-Csv NewFile.csv -NoTypeInformation 

Мой импорт CSV содержит несколько сотен столбцов и примерно половина, вероятно, не будет заполнен, поэтому, чтобы избавиться от лишних колонн было необходимо. Теперь мне просто нужно выяснить, как противодействовать непреднамеренному переупорядочению столбцов в алфавитном порядке по имени, без изменения имен.

Смежные вопросы