Tei5’s Blog

Tei5 の メモ書き

Windowsバッチファイルが正常に動作しない! (文字コード、改行コード)

Windowsバッチファイルが正常に動作しない!ときは、
文字コード、改行コードも疑ってみて!

 

文字コードは、S-JIS ! 

改行コードは CR+LF にする!

 

なぜか、改行コードが、LFになってしまっていて、ハマった・・。

UWSC とコマンドラインのエスケープ でハマった

コマンドラインというか、バッチファイルというか。
文字のエスケープはハマりがち。


そもそも、TSV(タブ区切り)を、Markdown の テーブルにしたい。

WEB サービスもあるけど、AWK なら簡単に作れるんじゃない?と思って作ってみて、意外とハマったので、メモ。

ハマりポイント

  • そもそも、UWSCクリップボードのテキストを、整形というか、コンバートするツールを使ってる。(今どき UWSC って!)
  • UWSC 内部で 「RESULT = DOSCMD( "gawk -f TSV2MD.awk hoge.tsv")」 とかすれば良いのだが、一行野郎で処理したいと思ったのが、運の尽き。

  • UWSC は、ダブルコーテーションのエスケープが冗長。 「<#DBL>

  • AWK で、区切りは、FS,OFS で簡単じゃね?と思ったら、$0 は$n を更新しないと、セパレータが更新されないようだ。そのために、 「$1=$1;」で更新。
  • コマンドラインで「|」は、パイプと認識される。エスケープ文字は「^

そもそもの、TSV2MD.awk のソース

BEGIN{
    FS="\t"; OFS="|";   # 入力セパレータは タブ 、出力セパレータは、| 縦棒

    getline;            # 一行目は、ヘッダとして一行読んで、
    $1=$1;              # $0 を更新(セパレータを更新)
    print "|" $0 "|";   # 前後に | をつけて、ヘッダを出力

                        # フィールドの数だけ、区切りを入れる。改行せずに
    for(i=1; i<=NF; i++){
        printf("|---");
        }
    printf("|\n");      # 最後には、| と 改行
}

{                       # ここから2行目以降の処理
    $1=$1;              # 同じく、$0 を更新して、
    print "|" $0 "|";   # 前後に | をつけて、データ行を出力
}

その後に、UWSC に組み込みの為の置換


コメントタブ と、改行 を無くして、一行に

BEGIN{FS="\t"; OFS="|"; getline; $1=$1; print "|" $0 "|"; for(i=1; i<=NF; i++){ printf("|---"); }printf("|\n");}{$1=$1;print "|" $0 "|";}

|」 を、「^|」 に

BEGIN{FS="\t"; OFS="^|"; getline; $1=$1; print "^|" $0 "^|"; for(i=1; i<=NF; i++){ printf("^|---"); }printf("^|\n");}{$1=$1;print "^|" $0 "^|";}

"」 を、「\<#DBL>」 に   (本来 UWSC では「<#DBL>」だが、コマンドラインで展開されることを見越して)

BEGIN{FS=\<#DBL>\t\<#DBL>; OFS=\<#DBL>^|\<#DBL>; getline; $1=$1; print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>; for(i=1; i<=NF; i++){ printf(\<#DBL>^|---\<#DBL>); }printf(\<#DBL>^|\n\<#DBL>);}{$1=$1;print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>;}

UWSC 用に、 「CMD_STR = "gawk <#DBL> ◯◯◯◯ <#DBL> "」 の中に入れる。
ここは、UWSCエスケープなので、「\<#DBL>」でなく、「<#DBL>

CMD_STR = "gawk <#DBL>BEGIN{FS=\<#DBL>\t\<#DBL>; OFS=\<#DBL>^|\<#DBL>; getline; $1=$1; print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>; for(i=1; i<=NF; i++){ printf(\<#DBL>^|---\<#DBL>); }printf(\<#DBL>^|\n\<#DBL>);}{$1=$1;print \<#DBL>^|\<#DBL> $0 \<#DBL>^|\<#DBL>;} <#DBL> "

なんじゃこれ。なっが~!
メンテナンス性最悪。オススメしかねるな。


TSV の例

date num str
2022/02/24  10  ABC
2022/02/25  123 hoge
2022/02/26      moge

Markdown Table

|date|num|str|
|---|---|---|
|2022/02/24|10|ABC|
|2022/02/25|123|hoge|
|2022/02/26||moge|

表示結果

date num str
2022/02/24 10 ABC
2022/02/25 123 hoge
2022/02/26 moge

お世話になったページ

cmd.exe のコマンドラインの仕様を解析してみた

awk で$0 出力するときに OFS 指定が無視られる問題

SQLiteで連続する日付テーブルをつくりたい(再帰SQL)

SQLite で連続する日付をつくりたい。

とある事情で、与える日付のフォーマットは、「YYYY/MM/DD」にしたい


やってることは?

再帰 SQL を使って、連番を作って 日付に直す。

julianday 関数は、日時を与えると、ユリウス日を返す。ユリウス日は、西暦紀元前4713年1月1日正午(グリニッジ時)から数えた通日。単位は日。
julianday 関数の引数は、「YYYY-MM-DD」で与えるので、replace で区切りを置き換えている。

('2020/02/25' を、'2020-02-25' に置換)

その後、strftime関数で 日付を作り直す。

日付の連番は これで、OK!

WITH RECURSIVE
  cnt(x) AS (VALUES(julianday(replace('2020/02/25', '/', '-') ))
  UNION ALL
   SELECT x+1 FROM cnt WHERE x < julianday(replace('2020/03/03', '/', '-') ))
SELECT x,strftime('%Y/%m/%d', x) AS DATE FROM cnt;

結果

2458904.5|2020/02/25
2458905.5|2020/02/26
2458906.5|2020/02/27
2458907.5|2020/02/28
2458908.5|2020/02/29
2458909.5|2020/03/01
2458910.5|2020/03/02
2458911.5|2020/03/03

実際は、左のx のカラムは要らないね。
× の 0.5 は何やねん。と思うけども、julianday関数は 正午が基準 なので、夜の0時は 0.5になる。


おまけ。数字の連番を作るには、

3 ~ 10を出力。

WITH RECURSIVE
  cnt(x) AS (VALUES(3) UNION ALL SELECT x+1 FROM cnt WHERE x < 10)
SELECT x FROM cnt;

結果

3
4
5
6
7
8
9
10

1から、2 つづつ増加させ、 10 個出力 (奇数で1~19)

WITH RECURSIVE
  cnt(x) AS ( SELECT 1  UNION ALL  SELECT x+2 FROM cnt  LIMIT 10 )
SELECT x FROM cnt;

結果

1
3
5
7
9
11
13
15
17
19

sqlite3 コマンドライン オプション のヘルプ日本語訳

sqlite3 コマンドライン オプション のヘルプ日本語訳 してみた。 訳はおかしいかもしれないので、ご注意を。DeepLにもお世話になってます。

・日本語

> sqlite3 --help
使用法:sqlite3 [OPTIONS] FILENAME [SQL]

FILENAME は SQLiteデータベースの名前です。
このファイルが存在しない場合、新しいデータベースが作成されます。

OPTIONSは以下の通り

-A ARGS... ".archive ARGS" を実行して、終了します
-append データベースをファイルの末尾に追加します
-ascii 出力モードを'ascii'に設定します
-bail エラー発生後、停止します
-batch 強制的にバッチI/Oにします
-box 出力モードを 'box' に設定します
-column 出力モードを 'column' に設定します
-cmd COMMAND 標準入力を読み込む前に COMMAND を実行します
-csv 出力モードを 'csv' に設定します
-echo 実行前のコマンドを表示します
-init FILENAME 名前付きファイルの読み取り/処理
-[no]header ヘッダのオン/オフを切り替えます
-help このメッセージを表示します
-html 出力モードをHTMLに設定します
-interactive 対話型I/Oを強制
-json 出力モードを 'json' に設定します
-line 出力モードを 'line' に設定します
-list 出力モードを 'list' に設定します
-lookaside SIZE N ルックサイド メモリに SZ バイトの N エントリを使用します
-markdown 出力モードを 'markdown' に設定します
-memtrace すべてのメモリの割り当てと解放をトレースします
-mmap N デフォルトの mmap サイズを N に設定します
-newline SEP 出力行の区切り文字を設定します。デフォルト: '\n'
-nofollow データベースファイルへのシンボリックリンクのオープンを拒否する
-nullvalue TEXT NULL値に対するテキスト文字列を設定します。デフォルト: ''
-pagecache SIZE N SZバイトのスロットをN個、ページキャッシュメモリに使用します
-quote 出力モードを 'quote' に設定します
-readonly データベースを読み取り専用で開きます
-separator SEP 出力列のセパレータを設定します。デフォルト: '|'
-stats 各ファイナライズ前にメモリの統計情報を表示します
-table 出力モードを 'table' に設定します
-version SQLite のバージョンを表示します
-vfs NAME NAMEをデフォルトのVFSとして使用します
-zip ファイルをZIPアーカイブとして開きます

・オリジナル

> sqlite3 --help
Usage: sqlite3 [OPTIONS] FILENAME [SQL]

FILENAME is the name of an SQLite database.
A new database is created if the file does not previously exist.

OPTIONS include:

-A ARGS... run ".archive ARGS" and exit
-append append the database to the end of the file
-ascii set output mode to 'ascii'
-bail stop after hitting an error
-batch force batch I/O
-box set output mode to 'box'
-column set output mode to 'column'
-cmd COMMAND run "COMMAND" before reading stdin
-csv set output mode to 'csv'
-echo print commands before execution
-init FILENAME read/process named file
-[no]header turn headers on or off
-help show this message
-html set output mode to HTML
-interactive force interactive I/O
-json set output mode to 'json'
-line set output mode to 'line'
-list set output mode to 'list'
-lookaside SIZE N use N entries of SZ bytes for lookaside memory
-markdown set output mode to 'markdown'
-memtrace trace all memory allocations and deallocations
-mmap N default mmap size set to N
-newline SEP set output row separator. Default: '\n'
-nofollow refuse to open symbolic links to database files
-nullvalue TEXT set text string for NULL values. Default ''
-pagecache SIZE N use N slots of SZ bytes each for page cache memory
-quote set output mode to 'quote'
-readonly open the database read-only
-separator SEP set output column separator. Default: '|'
-stats print memory stats before each finalize
-table set output mode to 'table'
-version show SQLite version
-vfs NAME use NAME as the default VFS
-zip open the file as a ZIP Archive

Amazon 画像をリサイズしてGET

Amazonの画像を取りたいが、トリミングしてあったり、リサイズされてたり。

オリジナルが欲しいなぁというときは。

例)

https://images-na.ssl-images-amazon.com/images/I/XXXXXXXXXXX._AC_SX60_CR,0,0,60,60_.jpg

 

・指定を無くすと、これで、オリジナルの画像がGETできる。
https://images-na.ssl-images-amazon.com/images/I/XXXXXXXXXXX.jpg

 

・AC は不明
・SX60  リサイズ。オリジナルよりは大きくできないみたい。
・CR,0,0,60,60 クロップらしい。 左上のXY座標、Width,Hight
 ピクセル指定は、リサイズの座標では?

 

リサイズについては、ここが詳しい。
https://at.sachi-web.com/blog-entry-880.html

SX、SY Xを、Yを
SL 長辺を
AA  正方形に とかあるらしい。


著作権、利用規定違反かどうかは知りません。自己責任で。

 

OBS / HIDMacros で 外付けキーボードをプログラマブルキーボード化

OBS Studio がかなり便利。

設定のホットキーを設定しておくと、ワンタッチでシーンを切り替えたり、スライドショーの順送り逆戻しみたいなことが可能。

だけど、一般的なキーボードでワンストークのホットキーにしていると、OBS以外のアプリとバッティングする。(テキストエディタを開いて読みながら、裏でOBSを動かしている場合、OBSホットキーを押した瞬間に反応してしまう。あまり使わないキーにしておけばいいが、実際のホットキーが使いにくいと意味がない。)

 

そこで、メインのキーボードとは別のキーボード(テンキー)を左手用に、マクロ専用のキーパッド代わりにするツールをつかう。

HID macros

かなり高機能っぽい。

・複数のキーボードを別々の設定にできる。(メインキーボードの[1]は通常通り、外部テンキーの[1]はマクロが動くなど)

・マウス、ジョイスティック(ボタンも軸も)なども設定可。

・アプリケーションの起動もできる。

スクリプトが組めるっぽい。(よくわからない)

 

■設定のヒント

 ・初回起動時、レジストリのエラーがでるみたい。管理者権限で動くようだが、自己責任で。

・Macros タブで、New。 Nameを適当につけて、TriggerのScanを押す。

設定したい物理的なキーを押す。Action の Send Keyboard Sequencs に動作したい内容を入力。詳細は下記参照。

最後に一番上の Compile All で設定できるようだ。

・起動中だけ、有効らしい。

 

■Send Keyboard Sequence の 例

Shift + F1 → (+{F1})

Ctrl + Shift + Alt + F12  → (^+%{F12})

 

 

・ キーストロークシーケンスでサポートされている修飾子
+ = シフト
^ = コントロール
% = Alt
& = タブ

 文字やキー名のシーケンスを括弧で囲み、グループとして変更することができます。

例えば、'+abc' は 'a' のみをシフトしますが、'+(abc)' は 3 文字すべてをシフトします。

修飾子 + ^ と % の前には < または > を付けることができます。その場合、左キーまたは右キーのコードが使用されます。

・サポートされている特殊文字
~ = Enter
( = 修飾子グループを開始(上記参照)
) = 修飾子グループを終了(上記参照)
{ = 開始キー名テキスト(下記参照)
} = 終了キー名テキスト(下記参照)

 

・OBSでは、F13~F24の設定はできなさそう。

通常あまり使わなそうな、Ctrl+Shift+Alt+F1 みたいなものを設定すると良いかも。

 

 

続きを読む

trdsql CSVに対してSQLを

CSVやTSVに対してSQLでデータ処理をしたい場合がある。

色々ツールがあるようだけど、個人的に具合が良いなと思うのが、trdsql。

 

・入出力形式が多い。CSV, TSV, JSONなど。標準入力も使える。

SQLのエンジンを色々使える。ディフォルトは SQLiteで、mysql、postgres も可。

・複数CSVの JOINも可能。

Windows版バイナリもある。

 

コツが必要な所が合ったので、メモ。

 

■ trdsql 追加メモ

文字コードUTF-8(? みたいなので)、nkf32 にパイプする。

 

・ファイルパスは そのままの記述でよさげ。ドライブ名も、¥マークも。
trdsql -icsv -od "\t" "SELECT * FROM D:\TEMP\集計.CSV NA ORDER BY NA.c1" | nkf32

 

・ファイルパスにスペースやハイフンが含まれるときは、ファイルパスを「\"」で囲む。( \ は¥マークね)
trdsql -icsv -od "\t" "SELECT * FROM \"D:\TEMP\集計 コピー.CSV\" NA ORDER BY NA.c1" | nkf32

UWSCの場合、「 "SELECT ~~~ FROM \<#DBL>" + CSV_PATH + "\<#DBL> " 」 みたいに指定する。

 

コマンドプロンプトだと、「`」で区切って表示されるが、実行指定時は、それではダメみたい。

 

・テーブル名は、基本的にフルパスで指定したほうが問題が無さそう。
 ファイル名がない場合、勝手にカレントから読むっぽい。それが、トラブルの原因になりそう。


・標準入力は 「-」 で指定できる
type sample.csv | trdsql -ih -oat "SELECT name FROM -"

 

CSV読むときは、-icsv をつけて、<テーブル名>.c1 みたいに参照できる。c1 は1番目のカラム。

CSVにヘッダがある場合、 -icsv -ih みたいにオプションつければ、<テーブル名>.DATE みたいにカラム名で参照できる。逆にカラム名に c1 とかは使えなくなる。

 

■以下 ヘルプの日本語訳

----------
trdsql - CSV、LTSV、JSON、TBLNに対してSQLクエリを実行する。

使用方法:
trdsql [OPTIONS] [SQL(SELECT...]]

オプション:
-A string ファイルを解析し、SQLのみを提案します。
-a string ファイルを解析して SQL を提案します。
-config string 設定ファイルの場所を指定します。
-db string 設定のデータベース名を指定します。
-dblist 設定のdb名を指定します。
-debug string デバッグを表示します。
-driver string データベースドライバを指定します。[ mysql | postgres | sqlite3 ]
-dsn string データベースドライバ固有のデータソース名です。
-help 使用方法の情報を表示します。
-q string 指定したファイルからクエリを読み込みます。
-version バージョン情報を表示します。
入力オプション:
-icsv 入力用のCSV形式です。
-id string 入力するフィールドの区切り文字です。(デフォルトは",")
-ig 拡張子からフォーマットを推測します。(デフォルトは "true ")
-ih 1行目はカラム名として解釈されます(CSVのみ)。
-ijson 入力にはJSON形式を使用します。
-iltsv 入力にはLTSV形式を使用します。
-ir int カラム判定のために読み込んだ行数を指定します。(デフォルトは1)
-is int ヘッダ行をスキップします。(デフォルトは0)
-itbln TBLN 形式で入力します。
出力オプション:
-oaq すべてのフィールドを引用符で囲んで出力します。
-oat 出力にはASCIIテーブルフォーマットを使用します。
-ocrlf 出力にはCRLFを使用します。各出力行を'\n'の代わりに'\r\n'で終了させます。
-ocsv 出力はCSV形式です。
-od string 出力するフィールドの区切り文字です。(デフォルトは",")
-oh ヘッダとして出力カラム名を指定します。
-ojson 出力にJSONフォーマットを使用します。
-ojsonl JSON Linesフォーマットで出力します。
-oltsv LTSV形式で出力します。
-omd マークダウン形式で出力します。
-onowrap 長い行を折り返さない(at/mdのみ)
-oq string 出力用クオート文字 (デフォルトは"\"")
-oraw Raw形式で出力します。
-otbln TBLN フォーマットで出力します。
-out string 出力ファイル名を指定します。
-out-without-guess 推測せずに出力します(-outを使用した場合)。
-ovf 出力用の縦書きフォーマットです。
-oz string 出力ファイルの圧縮形式を指定します。 [ gz | bz2 | zstd | lz4 | xz ]


www.DeepL.com/Translator(無料版)で翻訳しました。


----------
使用サンプル

trdsql "select c4,c6,c7,c8 from in1.txt where c3='0'" >in2q.txt
trdsql "SELECT u.*,h.c2 FROM in2t.txt as u LEFT JOIN keitai.csv as h ON(u.c4=h.c1)" > in3q.txt

----------
trdsql - Execute SQL queries on CSV, LTSV, JSON and TBLN.

Usage:
trdsql [OPTIONS] [SQL(SELECT...)]

Options:
-A string analyze the file but only suggest SQL.
-a string analyze the file and suggest SQL.
-config string configuration file location.
-db string specify db name of the setting.
-dblist display db information.
-debug debug print.
-driver string database driver. [ mysql | postgres | sqlite3 ]
-dsn string database driver specific data source name.
-help display usage information.
-q string read query from the specified file.
-version display version information.
Input options:
-icsv CSV format for input.
-id string field delimiter for input. (default ",")
-ig guess format from extension. (default "true")
-ih the first line is interpreted as column names(CSV only).
-ijson JSON format for input.
-iltsv LTSV format for input.
-ir int number of row preread for column determination. (default 1)
-is int skip header row. (default 0)
-itbln TBLN format for input.
Output options:
-oaq enclose all fields in quotes for output.
-oat ASCII Table format for output.
-ocrlf use CRLF for output. End each output line with '\r\n' instead of '\n'.
-ocsv CSV format for output.
-od string field delimiter for output. (default ",")
-oh output column name as header.
-ojson JSON format for output.
-ojsonl JSON Lines format for output.
-oltsv LTSV format for output.
-omd Markdown format for output.
-onowrap do not wrap long lines(at/md only).
-oq string quote character for output. (default "\"")
-oraw Raw format for output.
-otbln TBLN format for output.
-out string output file name.
-out-without-guess output without guessing (when using -out).
-ovf Vertical format for output.
-oz string output compression format. [ gz | bz2 | zstd | lz4 | xz ]

----------