2016-12-09 7 views
0

Я пытаюсь написать сценарий, который разделит очень большой CSV (1 миллион строк) на 100 csv. Я использую StreamReader вместо импорта, так как файл такой большой. я начал код:Powershell StreamReader, сделать переменную из каждой строки rreadline

$src = "c:\TestCSV.csv" 
$reader = New-Object IO.StreamReader($src) 
$header = Get-Content -Path $src | select -First 1 

while(($line = $reader.ReadLine()) -ne $null){ 
$data = $line -Split ',' 
$NiNumber = $data[9] 
$Char6 = $NiNumber.Substring(6,1); 
$Char7 = $NiNumber.Substring(7,1); 
$Group = $Char6 + $Char7 
Write-Host "▸▸ Adding Line to Group $Group " -NoNewline -ForegroundColor Yellow 
$stream =[System.IO.StreamWriter] "c:\test$Group.csv" 
$stream.WriteLine($line) 
$stream.Close() 
Write-Host -Object '✔' -ForegroundColor green 
} 
$reader.Close() 

Мой CSV имеет 13 столбцов с заголовками, я получаю номер группы из 9-го столбца по югу натягивания. Затем мне нужно вывести все строки в новый CSV с этим именем группы. Это работает для 1 строки, но, похоже, не добавляет никаких строк в CSV. (не уверен, что он просто создает новый CSV и перезаписывает существующий). Может ли кто-нибудь помочь мне закончить это, чтобы он добавил несколько строк в csv, а также, если возможно, добавить заголовки в каждый csv? любая помощь очень ценится.

+0

Рад это услышать, вы также должны опубликовать свое решение. Хотя я не уверен, что здесь есть вопрос. –

+0

HI Jim жаль нового на этом сайте, я добавил комментарий преждевременно, хотя я прогрессировал, чтобы теперь получить каждую строку, помещенную в CSV, она не добавляет несколько строк, а скорее создает новый файл каждый раз, независимо от того, уже существует, поэтому перезаписывает любые существующие файлы. что означает, что все файлы CSV имеют только одну строку. – John

+0

Джон, я думаю, вам нужно сделать свой вопрос яснее, я не уверен, о чем вы просите. Было бы также полезно разместить образец файла csv. –

ответ

1

Удалось устранить проблему с перезаписью, изменив способ, которым я назвал потоковый блок, и добавив $ true.

$src = "c:\TestCSV.csv" 
$reader = New-Object IO.StreamReader($src) 
$header = Get-Content -Path $src | select -First 1 
while(($line = $reader.ReadLine()) -ne $null){ 
$data = $line -Split ',' 
$NiNumber = $data[9] 
$Char6 = $NiNumber.Substring(6,1); 
$Char7 = $NiNumber.Substring(7,1); 
$Group = $Char6 + $Char7 
Write-Host "▸▸ Adding Line to Group $Group " -NoNewline -ForegroundColor Yellow 
$GroupPath = "c:\test$Group.csv" 
$stream = New-Object IO.StreamWriter($GroupPath,$true) 
$stream.WriteLine($line) 
$stream.Close() 
Write-Host -Object '✔' -ForegroundColor green 
} 
$reader.Close() 
+0

Если размер/время является проблемой, зачем использовать 3 команды вместо одного, чтобы получить $ group? '$ Group = $ NiNumber.Substring (6,2)' – LotPings

+0

Great @John. Поздравляем с вашим первым 10 указателем. Мне очень понравился подход, который вы сделали. –

+0

Хороший момент! Я был настолько сосредоточен на конечной цели, что даже не думал использовать одну переменную вместо 2, doh! Я запустил код на весь документ и оставил его в течение ночи, и он работал хорошо. – John