2019年02月

lzhファイルを解凍する

訳あって大量のlzhファイルの解凍が必要になった。

Windows10ではサポートされなくなったので7-Zipを利用してPowerShellで処理するためのメモ

準備

  • 7-Zipのダウンロード 7-Zip 64ビットWindows x64のEXE版(7z1806-x64.exe)を使用する
  • ダウンロードしたEXEファイルを実行してインストール場所を指定してインストール
  • 作業フォルダの作成(c:\work\7zip)
  • lzhファイルを用意(c:\work\7zip\lzh)

基本的なコマンドラインオプションと実行例

e フォルダ構造を無視して展開
x フォルダ構造を維持して展開
-o 展開先

#インストールフォルダの中にある7z.exeを指定  
& 'C:\Program Files\7-Zip\7z.exe' x -o"C:\Work\7zip" "C:\Work\7zip\lzh\comp_file.lzh"

$? #エラー判定(解凍に成功すればTrue、失敗すればFalseが返される)

7z.dllと7z.exeがあればインストールしなくても解凍が出来る模様
以下、任意のフォルダに7z.dllと7z.exeをコピーした際の実行例

cd C:\Work\7zip
.\7z.exe x -o".\" ".\lzh\comp_file.lzh" 
$?

エラーが発生したファイルをログファイルに記載するサンプル

dir -Path .\lzh -Filter *.lzh | %{.\7z.exe x -o".\" $_.FullName; if($? -eq $false){$_.FullName | Out-File .\エラーファイル.log -Append }}

LibreOffice BaseでSQLからテーブルを作成する方法をメモ

準備 LibreOffice(Windows10 64bit)

  • LibreOffice_6.0.7_Win_x64をインストール
  • baseの実行には64bitのJREが必要なのでインストールしておく
  • 必要に応じてマニュアル

テーブルの操作

[ツール]-[SQL]から以下のSQLを実行、テーブルを作成する。

base_sql01

テーブルの作成

CREATE TABLE jobs ( job_id VARCHAR(10) PRIMARY KEY, job_title VARCHAR(35) NOT NULL, min_salary INTEGER, max_salary INTEGER);
base_sql02

続けてレコードの挿入

INSERT INTO jobs VALUES ('AD_PRES' , 'President' , 20080 , 40000);
INSERT INTO jobs VALUES ('AD_VP' , 'Administration Vice President' , 15000 , 30000);
INSERT INTO jobs VALUES ('AD_ASST' , 'Administration Assistant' , 3000 , 6000);
INSERT INTO jobs VALUES ('FI_MGR' , 'Finance Manager' , 8200 , 16000);
INSERT INTO jobs VALUES ('FI_ACCOUNT' , 'Accountant' , 4200 , 9000);
INSERT INTO jobs VALUES ('AC_MGR' , 'Accounting Manager' , 8200 , 16000);
base_sql03

[表示]-[テーブルの更新]を押下すると作成したテーブルが現れる

base_sql04

SQLからクエリを作成することも可能

※小文字でテーブルを作成しても大文字でテーブル・カラム名が作成される。 小文字で記述するとエラーになる。

base_QUERY

PowerShellからSQLiteに接続

準備 SQLiteのダウンロード

準備 SQLITEのDB作成

#sqlite3.exeの置かれているディレクトリに移動後DB作成
.\sqlite3.exe DBTEST.sqlite3 #大文字小文字は区別しないが拡張子の有無しは区別するので次回以降の接続も拡張子付きで接続する
.database #何かしらの操作をしないとDBファイルを作成してくれない
.exit

.\sqlite3.exe DBTEST.sqlite3 #再接続
#テスト用にテーブルを作成
CREATE TABLE jobs
    ( job_id TEXT PRIMARY KEY
    , job_title TEXT NOT NULL
    , min_salary INTEGER
    , max_salary INTEGER
    ) ;

.tables #作成したテーブルの確認
.exit

※一度接続を切らずに全て連続で作業しても構わない。
 DBファイルはパスを指定すれば任意の場所に作成可能

DBの操作

#ライブラリの読込
Add-Type -path "C:\Work\SQLite\net\System.Data.SQLite.dll"

$conn = New-Object System.Data.SQLite.SQLiteConnection
$conn.ConnectionString = "Data Source = C:\work\SQLite\DBTEST.sqlite3"
$cmd  = New-Object System.Data.SQLite.SQLiteCommand($conn)
$conn.Open()

#Oracleのような仮想テーブル(dual)は無いが、FROM句を省略すれば似たような動作になる
$sql = "SELECT 'val1','val2','val3'"
$cmd.CommandText=$sql
$reader = $cmd.ExecuteReader()
while ($reader.read())
{
    $reader.GetString(0)
    $reader.GetString(1)
    $reader.GetString(2)
    write-host ""         
}
$cmd.Dispose() #ODPと異なり一度破棄しないとコマンド実行できなくなる

#insert
$cmd.CommandText="INSERT INTO jobs VALUES ( 'AD_PRES' , 'President' , 20080 , 40000 );"
$cmd.ExecuteNonQuery()
$cmd.CommandText="INSERT INTO jobs VALUES ( 'AD_VP' , 'Administration Vice President' , 15000 , 30000 );"
$cmd.ExecuteNonQuery()
$cmd.CommandText="INSERT INTO jobs VALUES ( 'AD_ASST' , 'Administration Assistant' , 3000 , 6000 );"
$cmd.ExecuteNonQuery()
$cmd.CommandText="INSERT INTO jobs VALUES ( 'FI_MGR' , 'Finance Manager' , 8200 , 16000 );" 
$cmd.ExecuteNonQuery()

#update
$cmd.CommandText="UPDATE jobs SET min_salary = 8000 WHERE job_id = 'FI_MGR';" 
$cmd.ExecuteNonQuery()

#DELETE 
$cmd.CommandText="DELETE FROM jobs WHERE job_id = 'FI_MGR';" 
$cmd.ExecuteNonQuery()

#確認
$cmd.CommandText = "select * from jobs"
$reader = $cmd.ExecuteReader()
while ($reader.read())
{
    $reader["job_id"].tostring()
    $reader["job_title"].tostring()
    $reader["min_salary"].tostring()
    $reader["max_salary"].tostring()
    write-host ""         
}

$cmd.Dispose()
$conn.Close()
$conn.Dispose()

※ExecuteNonQuery実行時はDisposeするとNew-Objectで呼びなおす必要がある。