himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

Unicode text ファイルを SQLIte デフォルトの text ファイルに変換する PowerShell スクリプト

ExcelUnicode text 出力は BOM が付くので SQLite からは読み込めない(はず)。
どうせ BOM 外しに変換するなら、ついでに encoding と separator も変更することにした。
このスクリプトは、chooseCSVFileで選択したtextファイルと同じフォルダにある全てのtextファイルをUTF8 BOM無し、かつファイル中のtabを'|'に全置換する。
unicode2UTF8nonBOM と chooseCSVFile は .psm1 としてそのうちモジュール化したい。

# toolUniTxt2SQLtxt.ps1

# Excel unicode text to SQLite default text
function unicode2UTF8nonBOM{
    param( $xlsU, $sqltDefault )
    $sw = New-Object System.IO.StreamWriter $sqltDefault, $( New-Object System.Text.UTF8Encoding($False) )
    gc $xlsU -encoding Unicode | % {  $sw.WriteLine( $_.replace( "`t","|" ) ) }
    $sw.close()
}

# choose of text file
# File 選択 Dialog が開き(ShowDialog)"OK" ボタンが押された場合:選択された filePath、そうでない場合:nullstring が返る
$chooseCSVFile = {
    # Sytem.Windows.Forms 参照 :: File 選択 Dialog の御膳立て
    Add-Type -Assembly System.Windows.Forms
    # File 選択 Dialog を参照
    $dlg = New-Object System.Windows.Forms.OpenFileDialog
    $dlg.Filter = "Text(*.csv;*.txt)|*.csv;*.txt"
    $dlg.InitialDirectory = "."
    $dlg.Title = "ファイル選択"
    return $( if($dlg.ShowDialog() -eq "OK"){ $dlg.FileNames }else{ "" } )	
}

$ScriptBase = Split-Path ( & { $myInvocation.ScriptName } ) -parent
pushd $ScriptBase

$choosePath = &$chooseCSVFile
$chooseParent = split-path $choosePath -parent
gci $chooseParent | ? { $_.name -match ".txt" } | % {
    $srcPath = join-path $chooseParent $_.name; $srcPath
    $dstPath = join-path $chooseParent $([regex]::replace($_.name,".txt$",".sqltxt")); # $dstPath
    unicode2UTF8nonBOM -xlsU $srcPath -sqltDefault $dstPath
}
popd