It never seems to fail that a project will come about that will require someone to enter some data into a spreadsheet for some form of import in to your database. It also never seems to fail that no matter how many times you ask you end up with a xslx or some other form of office spreadsheet that isn't friendly with bulk insert. Sometimes you do get a csv but they created it oddly and the delimiters are wrong or not in the right places. This little script opens an excel sheet and converts it to a csv. Then reads each file in and line by line turns that into a select union script. We used this in aback end process to add data to users to our system.
function ConvertFrom-XLx {
param ([parameter(
Mandatory=$true,
ValueFromPipeline=$true,
ValueFromPipelineByPropertyName=$true)]
[string]$path ,
[switch]$PassThru
)
begin { $objExcel = New-Object -ComObject Excel.Application }
Process {
if ((test-path $path) -and ( $path -match ".xl\w*$")) {
$path = (resolve-path -Path $path).path
$savePath = $path -replace ".xl\w*$",".csv"
$objworkbook=$objExcel.Workbooks.Open( $path)
$objworkbook.SaveAs($savePath,6) # 6 is the code for .CSV
$objworkbook.Close($false)
if ($PassThru) {Import-Csv -Path $savePath }
}
else {Write-Host "$path : not found"}
}
end { $objExcel.Quit() }
}
dir *.xlsx | ConvertFrom-XLx
$command = 'ls *.csv'
$array =[string] @()
$array = ls -filter "*.csv"
$out = [string] @()
foreach ( $i in $array) {
$Sql = [string] @()
"processing file:" + $i
$Count = 0
$sql += "Select * from ( select null as Column1,null as Column2,null as Column3,null as Column4,null as Column5 "
foreach ($a in Get-Content $i) {
$sql +=" Union All"+ "`n"
$count += 1
$Values = "$a".split(',')
$sql += "select" + "'"+$values[0] + "'"+ ","+ "'"+$values[1] + "'"+ ","+ "'"+$values[2] + "'"+ ","+ "'"+$values[3] + "'"+ ","+ "'"+$values[4] + "'" #+" Union All" + "`n`r"
}
$sql += ") q2 where Firstname is not null"
$out = $sql
"Sql for File:`n`r" + $out
$outfile = "$i".replace(".csv",".sql")
$out | Out-File $outfile
}
}
No comments:
Post a Comment