/ /どのようにPowershellからクエリをExcelのデータ型の戻り値を強制するには? - エクセル、パワーシェル、オードブル

Powershellからクエリを実行する際に強制的にデータ型を返す方法 - エクセル、パワーシェル、オードブル

私は使用しています Powershell OLEDB接続を使用してExcelスプレッドシートにクエリを送信します。私はそれに複数の値を持つ1つの列を持っています。私は、4つのセルのうちの1つに文字が含まれていると、クエリは NULL データ型はa System.DBNull。下記参照:

Excelスプレッドシート1

スクリプト出力:

PS D:temp> D:WCC_PowershellExcelTypeTest.ps1 test.xls
Ticket Number: 1 | Type: System.Double
Ticket Number: 2 | Type: System.Double
Ticket Number:  | Type: System.DBNull
Ticket Number: 4 | Type: System.Double

しかし、4つのセルのうち2つに文字が含まれていると、すべてのセルデータタイプが String。例:

Excelスプレッドシート2

スクリプト出力:

PS D:temp> D:WCC_PowershellExcelTypeTest.ps1 test.xls
Ticket Number: 1 | Type: System.String
Ticket Number: ZZZZ | Type: System.String
Ticket Number: AAAA | Type: System.String
Ticket Number: 4 | Type: System.String

Powershellからクエリを実行するときにExcelの列の戻り値の型を強制する方法はありますか?私のスクリプトは、1)そこにデータがあり(NULLを返さない)、2)データ型を知っているかどうかを知る必要があります

ここでは、Excelの文書を解析するために使用するスクリプトです:

########################################################################################################
# This function will test if a string value is numeric
# Parameters:
#   $value   - String to test
########################################################################################################
function IsNumeric($value) {
return ($($value.Trim()) -match "^[-]?[0-9.]+$")
}

########################################################################################################
# This filter will test if a string value is numeric
# Parameters:
#   $value   - String to test
########################################################################################################
filter isNumeric2() {
return $_ -is [byte]  -or $_ -is [int16]  -or $_ -is [int32]  -or $_ -is [int64]  `
-or $_ -is [sbyte] -or $_ -is [uint16] -or $_ -is [uint32] -or $_ -is [uint64] `
-or $_ -is [float] -or $_ -is [double] -or $_ -is [decimal]
}

# Directory location where we have our excel files
########################################################################################################
$excelFN = "$args"
$ExcelFile = "D:Temp$excelFN"
$Sheetname = "Interface$"

########################################################################################################
$OleDbConn = New-Object “System.Data.OleDb.OleDbConnection”
$OleDbCmd = New-Object “System.Data.OleDb.OleDbCommand”
$OleDbAdapter = New-Object “System.Data.OleDb.OleDbDataAdapter”
$DataTable = New-Object “System.Data.DataTable”
$OleDbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$ExcelFile`";Extended Properties=`"Excel 12.0 Xml;HDR=YES`";"
$OleDbConn.Open()
$OleDbCmd.Connection = $OleDbConn
$OleDbCmd.commandtext = “Select * from [$Sheetname]”
$OleDbAdapter.SelectCommand = $OleDbCmd
########################################################################################################

$RowsReturned = $OleDbAdapter.Fill($DataTable)
$intRow = 1
ForEach ($DataRec in $DataTable) {

# Reading the first column of the current row
$TicketNumber = $DataRec."ticket number"

write-host "Ticket Number:" $TicketNumber "| Type:" $TicketNumber.GetType()

$intRow++
}

$OleDbConn.Close()

回答:

回答№1は1

これによれば KB記事 (重点追加):

混合データ型に関する注意

前述のように、ADOはデータを推測する必要があります各列のタイプ あなたのExcelのワークシートまたは範囲で。 (これはExcelセルの影響を受けません 書式の設定を参照してください。)数値がある場合、重大な問題が発生する可能性があります 値は同じ列のテキスト値と混在しています。ジェット機と ODBCプロバイダ 大多数の型のデータを返しますが、NULLを返します。 (空の)少数のデータ型の値。 2つのタイプが 列内で均等に混合された場合、プロバイダはテキストの上に数値を選択します。

「安全な」オプションは、すべてのフィールドをテキストとして扱います。 IMEX=1 オプションを接続文字列に追加する:

"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=`"$ExcelFile`";Extended Properties=`"Excel 12.0 Xml;HDR=YES;IMEX=1`";"

次のような明示的なキャストを使用してPowerShellスクリプトの数値を変換します。

[int]$value
# or
$value -as [int]

次のような単項演算子によるソフト強制変換:

+$value

または次のような静的解析を使用します。

[int]::Parse($value)
# or
$numericValue = 0
[int]::TryParse($value,[ref]$numericValue)