如何从 csv 文件创建 sql table?
How to create a sql table from a csv file?
给定一个 .csv
文件,Fact.csv
,假设有 7 列
最终目标是拥有这样的东西:
script.ps1 Fact.csv 3 4
其中前 3 列肯定是 varchar
类型,而其余列 (4) 是 real
类型。
如何循环遍历 .csv
文件的 headers(它可以包含数据,但我们不想导入数据,只是列的 headers table 的名称),并动态创建 table(.csv
文件的名称,例如 Fact
)以及 table 列,使用上面由数据库中的数字指定的列类型?
伪代码:
$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name
Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = $Query
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0] }
foreach ($column in $csvHeaders | where 1st $x columns = varchar and remaining columns = real) {
Query "CREATE TABLE [dbo].[$csvfile.name](
[column1] [varchar](100) NOT NULL,
[column2] [varchar](100) NOT NULL,
[column3] [varchar](100) NOT NULL,
[column4] [real] NULL,
[column5] [real] NULL,
[column6] [real] NULL,
[column7] [real] NULL
) ON [PRIMARY]"
}
更好的是,如果有办法告诉 Powershell 只有前 x 列是 varchar
,而其余列是 real
,我们就不必指定 4。
这不是一个完整的答案,只是一个指导,显示了一个可能有语法错误的不优雅的暴力方法。有 PS 支枪可能可以将其减少到三行。
扩展你的伪代码:
$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name
$query="CREATE TABLE [dbo].[$csvfile.name]( "
$index=1
foreach ($column in $csvHeaders) {
$query=$query+"[$column] "
if($index -gt $varcharendposition) {$query=$query+"real, "} else {$query=$query+"varchar(50), "}
$index++
}
$query=$query + ") "
Query $query
这将充满错误,但请尝试并在出现时解决每个错误或错误。然后你可以post你的答案并接受它。
给定一个 .csv
文件,Fact.csv
,假设有 7 列
最终目标是拥有这样的东西:
script.ps1 Fact.csv 3 4
其中前 3 列肯定是 varchar
类型,而其余列 (4) 是 real
类型。
如何循环遍历 .csv
文件的 headers(它可以包含数据,但我们不想导入数据,只是列的 headers table 的名称),并动态创建 table(.csv
文件的名称,例如 Fact
)以及 table 列,使用上面由数据库中的数字指定的列类型?
伪代码:
$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name
Function Query($Query) {
$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$Server;Initial Catalog=$Database;Integrated Security=SSPI"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.Connection = $SqlConnection
$SqlCmd.CommandText = $Query
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object System.Data.DataSet
$a=$SqlAdapter.Fill($DataSet)
$SqlConnection.Close()
$DataSet.Tables[0] }
foreach ($column in $csvHeaders | where 1st $x columns = varchar and remaining columns = real) {
Query "CREATE TABLE [dbo].[$csvfile.name](
[column1] [varchar](100) NOT NULL,
[column2] [varchar](100) NOT NULL,
[column3] [varchar](100) NOT NULL,
[column4] [real] NULL,
[column5] [real] NULL,
[column6] [real] NULL,
[column7] [real] NULL
) ON [PRIMARY]"
}
更好的是,如果有办法告诉 Powershell 只有前 x 列是 varchar
,而其余列是 real
,我们就不必指定 4。
这不是一个完整的答案,只是一个指导,显示了一个可能有语法错误的不优雅的暴力方法。有 PS 支枪可能可以将其减少到三行。
扩展你的伪代码:
$csvfile = .\Fact.csv
$csv = Import-CSV $csvFile
$csvHeaders = ($csv | Get-Member -MemberType NoteProperty).name
$query="CREATE TABLE [dbo].[$csvfile.name]( "
$index=1
foreach ($column in $csvHeaders) {
$query=$query+"[$column] "
if($index -gt $varcharendposition) {$query=$query+"real, "} else {$query=$query+"varchar(50), "}
$index++
}
$query=$query + ") "
Query $query
这将充满错误,但请尝试并在出现时解决每个错误或错误。然后你可以post你的答案并接受它。