Vimとサクラエディタでcsvに立ち向かう正規表現
( ´_ゝ`)ノシ
yoshitiaです。
夏になったのでトップの画像変えなきゃと思いつつ秋を迎えそうです。
タイトルの話ですが、DBとかでテスト用データ作る時、
csvを軽く編集したい、そういうことありますよね。
で、大量データは自動生成するとして
作った後に微妙に修正したい箇所が出来た時、
直接編集したい、そういうのありますよね?
でも投入するデータのcsvが1行数百カラムだったり、
複数の項目に入る文字数が均一でなくてレコードごとに
目的のカラムの位置が異なる。
(ノ`Д´)ノ彡┻━┻ としたくなりますが
お仕事だとそうはいかないわけで。
そこで検索のシンタックスハイライトを利用して
カラムの位置を特定して作業を楽にします。
サクラエディタの場合だと
検索で正規表現を使用するチェックを入れてから
^[^,]*,([^,]*,){2}
を検索窓に入力して実行します。
書いてる例の正規表現の意味は
^[^,]*,が行頭から一つ目のカンマまでの文字列を検索対象にしていて
([^,]*,){2}は()の中の検索対象の{n}回繰り返しを検索対象にしています。
例の場合はカンマ以外の文字列とその後ろに付くカンマのセットの2回繰り返しが検索対象です。
この2つを繋げると、
「行頭からcsvの3カラム目までを検索対象にする」正規表現になります。
{}の数字を増減させると検索対象になるカラム数を調節できます。
Vimの場合だと
\v^[^,]*,([^,]*,){2}
これを/の入力後に入力します。
頭に\vが付く以外はサクラエディタの場合と同じです。
Happy Vim Life!
Netezzaのメモ。
( ´_ゝ`)ノシ
最近記事書くのご無沙汰なyoshitiaです。
Netezzaについてちょっとだけメモを書く。
Oracleのlistagg関数、すごく便利ですね。
TEST table
NO | WORD
--------------
1 | Apple
2 | Ball
1 | Cat
1 | Dog
2 | Egg
---------------------------------------
SELECT
No
, LISTAGG('WORD',', ') AS RESULT
FROM
TEST
GROUP BY
NO;
---------------------------------------
NO | RESULT
-------------------
1 | Apple, Cat, Dog
2 | Ball, Egg
---------------------------------------------------
netezzaだとgroup_concatという関数があるみたい。
(デフォルト関数ではない。導入方法は下記リンク)
ただし、マルチバイト文字非対応らしく、扱う値が日本語だと文字化けする。
コードはC++みたいだけどC++力が無いのでどう修正したらいいのかわからないのがつらい。
新しく使うなら日本語を扱わない様にデータ用意するしかないんだろうなぁ・・・。
Ubuntuでのfcitx+vim or emacsの日本語インライン入力の話。
( ´_ゝ`)ノシ
yoshitiaです。
使いたいソフトの関係でLinuxPCのOSを
Arch LinuxからUbuntu Server 14.04に変更しました。
vim: version 7.4.1747
emacs: version 24.5.1
Linuxだと毎回日本語周りで面倒が起きるわけで。
今回も色々あったので対処した記録をここに残します。
インライン入力って何よ?
PCで日本語入力を行う時、
EnterやC-mで確定させる前に
下線と一緒に入力した文字が表示されているアレです。
Linuxでは上手く設定されていないと
Enterで確定させるか変換の為にスペース押したりしないと
「何を入力しているのか見えない」
つらい。
この記事はそれについての話。
fcitx+gvimでの日本語インライン入力
このあたりが原因らしい。
github.com
Ubuntuだと /usr/share/applecations あたりにGVim(gvim.desktop)があるので
プロパティから
gvim -f %F
を
vim -gf %F
に修正するとインライン入力が表示される。
fcitx+emacs(gui)での日本語インライン入力
この記事のやり方でいけそう。
mochalog.hatenablog.com
最後に
流石に何回もやってると対処法探すまでの時間が短くなってて草。
何故fcitxだけか?親指シフト使いたいからですハイ。
VimやEmacsのコマンド入力とかの話。
( ´_ゝ`)ノシ
yoshitiaです。
backspace.fmのVim-side#002を聞いて久しぶりにスパルタンVimを読み返しました。
backspace.fm
www.kaoriya.net
pdfによると、キー配置を変えずにコマンドを増やせ、とありますが
コマンド打つのが面倒だと思うのが普通だと思います。
が、Vimのコマンド補完地味に優秀だったりする・・・。
Vimのコマンド補完
組み込みの関数は大抵省略形があります。(help見よう)
:w[rite] :q[uit] :e[dit] :vim[grep]
AFunctionという名前のコマンドがあった場合、
:AFu
くらいまで打ってタブを押すと残りを補完してくれる。
:AFunction
複数候補がある場合ステータスラインに候補を表示してくれる。
|AFunction1 AFunction2| :AFunction
試しに:aと打ってからタブを押すといくつか表示されるはずです。
複数ある場合は
(この機能はコマンド名の大文字小文字は気にしません)
もし、何文字か入力して前方一致するコマンドが1つしかない場合は
タブで補完しなくても指定のコマンドを実行してくれます。
yoshitiaはtwit.vimを使っていてホームのタイムラインを見るとき、
:FriendsTwitter
を使いますが、
yoshitiaのVim設定だとFrから始まるコマンドはこれ1つだけなので
:Fr
とタイプしてEnterrまたは<C-m>するだけで実行できます。
(この機能はコマンド名の大文字小文字をきっちり区別して入力しないと
上手く動いてくれません)
この機能を把握していればよく使うコマンドの最低必要タイプ数を
覚えているだけでかなり楽になります。
作業用の即席コマンド名の頭数文字をホームポジションの文字で作ると
すごく便利だと思います
実際プラグインの関数はa,s,d,f,gで始まるコマンドが多いようで
左手で少ないタイプ数からコマンドを実行して
右手でカーソル移動や検索での移動をしようという思想を感じます。
(※個人の感想です。)
Emacsのコマンド補完
この辺の話はるびきちさんの本か記事で見たと思います。
記憶が怪しい・・・。
るびきち「日刊Emacs」
EmacsではM-xからコマンドを入力しますが
コマンド名が
eval-last-sexp
のようになっていて
慣れていないと
M-x eval
と入力してタブを押して
候補を確認する、とやるのが普通ですが
ハイフン区切りごとの頭2文字ずつとハイフンで
入力文字数を省略できます。
yoshitiaのEmacs設定だとeval-last-sexpを
M-x ev-la
と入力した後Enterまたは<C-m>で実行できます。
これは最初の区切りがevで始まって
次の区切りでlaから始まるコマンドが
これしかないからです。
(個々人のEmacs設定では違うこともあると思います)
ただ、なかなか最初の区切りの2文字だけで
入力できるケースが少ない気がするので
Emacsで使用頻度の高いコマンドは素直に
キーバインドに設定しちゃった方がいい気がします。
スパゲティコードを見たので書いた。
( ´_ゝ`)ノシ
yoshitiaです。
ニコニコ動画でスパゲティコードなるネタが出てたので
それを書いた。
高画質版 とあるエンジニアのアイドルプロデュースログ 劇場版_3.Log ‐ ニコニコ動画:GINZA
#include<stdio.h> int main(void) { int month, day; char* m; printf("What month is it now? Type between 1 and 12.: "); scanf("%d", &month); // キーボード入力から10進数を取得 if (month == 1) { day = 31; m = "Jan";} else if (month == 2) { day = 28; m = "Feb";} else if (month == 3) { day = 31; m = "Mar";} else if (month == 4) { day = 30; m = "Apr";} else if (month == 5) { day = 31; m = "May";} else if (month == 6) { day = 30; m = "Jun";} else if (month == 7) { day = 31; m = "Jul";} else if (month == 8) { day = 31; m = "Aug";} else if (month == 9) { day = 30; m = "Sep";} else if (month == 10){ day = 31; m = "Oct";} else if (month == 11){ day = 30; m = "Nov";} else if (month == 12){ day = 31; m = "Dec";} else { day = -1; m = "error";} // 取得した値が1~12以外の数か、数字でない場合 if (m == "error") { printf("usage: Type number between 1 and 12\n");} // "使用法: 1から12までの数値を入力してください\n" else { printf("%s is %d days.\n", m, day);} // 出力例: Jan is 31 days. return 0; }
細かい所は違う気がするが気にしない。
( ゚Д゚)ウヒョーelseifが目に痛い。
Vimで書きましたまる
2016/3/12追記
プロログPより
else { day = -1; m = "error";}をelse { day = -1:}にして
if (m == "error")をif (day == -1)にするとシンプルになるよと
赤ペン先生してもらった。
( ゚д゚ )
( ゚д゚ )
( ゚д゚ )
weblogicでlog4j.xmlを上手く読み込んでくれない時の話
( ´_ゝ`)ノシ
yoshitiaです。
今週はずっとAntとweblogic10.3.6使ってました。
javajavaしてます(コーヒーは飲んでいない)。
で、webアプリケーション起動時、
log4j.xmlが読み込まれてくれないorz
その対処のお話です。
2016/3/5 対処法に勘違いがあったので修正。
ググると大抵見つかる記事の対処方法
2016/3/4追記
log4jはweblogic側で利用する場合と
webアプリケーションが利用する場合で
対処法が違ってたorz
1はwebアプリケーションがlog4jを使っている時の対処、
2がweblogic自身のログ出力でのlog4j設定
1. warファイルのWEB-INF/classesフォルダに
log4j.xmlがあれば解決
(srcフォルダの直下におけばいい?)
2. weblogicの起動時オプションに
-Dlog4j.configuration=file:///
( ´_ゝ`)
1はEclipseでの対処法っぽい。
が対象のプロジェクトはEclipse使わずに
直接Antでビルドを行う。
正直Eclipseに取り込む手順を知らぬ。
つまり、
【却下】
∧,,∧ .∧,,∧
∧∧(´‐ω‐`)(´‐ω‐`)∧∧
(´‐ω‐).∧∧) (∧∧ (‐ω‐`)
| U (´‐ω‐`)(´‐ω‐`) と ノ
u-u (l ) ( ノ u-u
`u-u' `u-u'
2はtypoしてる所があるのか上手くいかないorz
なのでそれ以外の対処をしてみた。
2はsetDomainEnv.cmdかshあたりに
LOG4J_CONFIG_FILEって変数を設定する部分が有るので
そこにxmlの場所書いておけば動く。
1のwarファイルのWEB-INF/classesフォルダに
log4j.xmlがあれば解決、を
srcフォルダに置く以外の方法でやってみた。
力技編
webアプリケーション実行時の
WEB-INF/classesフォルダに
直接log4j.xmlを配置する。
webアプリケーション実行時は
weblogicのドメインフォルダ
(デフォルトならbase_domain)内の
servers/サーバ名/tmp内を探索すると
warフォルダがあって
その中をさらに探すとWEB-INF、
更に中にclassesフォルダがあるので
そこに置く。
力技なのでwebアプリケーションサーバを
起動している間しかもたない。
ビルド時に対処編
根本的な対処法。
まずwarファイルの元になるプロジェクトの
WEB-INF/classesフォルダにlog4j.xmlを放り込む。
次にbuild.xmlを修正する。
(元々classesタグが書いてあれば
WEB-INF/classesフォルダにlog4j.xmlを追加するだけでいける)
<war destfile="hoge.war" webxml="(web.xmlの場所)"> 略 <classes dir="(WEB-INF/classesの場所)" /> <!-- classesタグを追加 --> </war>
EclipseでもAntでビルドしてるならこの方法が使えるはず。
余分なファイルや格納したくないファイルが
WEB-INF/classes内にある場合は
includes="追加したいファイル"か
excludes="格納したくないファイル"を
上手く使えばいいと思う。
まとめ
AntはJava使ってるならいつかは出会うツールだと思うので
Javaの勉強をしてる人は息抜きに触ってると
幸せになれるかもしれません。
www.amazon.co.jp
batファイルおさらい
( ´_ゝ`)ノシ
yoshitiaです。
色々あって2015年の年末に勤めてた会社やめて
2016年の2月から別の会社に入りました。
教訓: 人の縁マジ大事
本題。
ちょっとコマンドプロンプトのbatファイル使う機会が出来た時に
「まったくのプログラミング初心者って
いきなりプログラミング言語入るよりコマンドプロンプトや
シェルスクリプトから入った方がよくね?」
と思い立ってbatファイル書いてみることにした。
(煎じ過ぎて出がらしだろうなぁ)
定番のHelloWorldから。
hello.batファイルを作って書く。
pauseはbatファイル実行終了後画面が即閉じるのを防ぐ。
echo Hello World! pause
ファイルを保存したらbatファイルをクリック。
コマンドプロンプトが出てきて次の文字が表示される。
echo Hello World! Hello World! 続行するには何かキーを押してください . . .
echo Hello World!の部分は不要なのでこう書く。
@echo off echo Hello World! pause
行頭に@をつけるとその行は画面に表示されない。
echo offにすると次の行から実行するコマンドが
表示されなくなる。
echo Hello World! Hello World! 続行するには何かキーを押してください . . .
それとbatファイルの中に実行コマンドの説明文を入れる時は
remを使う。
echo offの次の行からじゃないと画面に表示されるので注意。
@echo off rem hello.bat - コマンドプロンプト画面にHello World!を表示する。 echo Hello World! pause
変数を設定してみる
cd %~dp0 rem set.bat - 変数を設定して利用する rem 変数を設定します。setで変数を設定すると rem 長い文字列を何度も入力しなくて良くなります。 rem batファイルが終了するとsetされた変数は削除されます。 set longstring=寿限無寿限無五劫の摺り切れ海砂利水魚の水行末雲来末風来末食う寝る所に住む所藪柑子ブラコウジパイポパイポパイポのシューリンガンシューリンガンのグーリンダイグーリンダイのポンポコピーのポンポコナーの長久命の長助 echo %longstring% echo; rem echo;で改行してます。 echo 12345%longstring% rem 変数の前後に文字をくっつけて表示できます。 echo; echo %longstring%67890 echo; pause
setを使うとJAVA_HOMEとかをbatファイル実行中の間設定できるので
環境変数がないと実行できないソフトを軽く試すこともできます。
実行前確認メッセージを表示させる
crowd-logic.com
リンク先のコードにあるgoto :yes、goto :noは
:noまたは:yesと書いてある行の次の行からのコマンドを実行するものです。
exitは実行するとbatファイルの実行をそこで終了します。
gotoは簡単に処理を実行したい行に移動できますが
使いすぎるとコードの順番を読むのが難しくなるので
極力使わない方がいいです。
(リンク先のgotoの使い方は良い使い方なので参考になります)
文字列置換 2016/03/12追加
@echo off cd %~dp0 @rem replace.bat - 変数に格納した文字列の文字を置換 @rem ポイント: =の左右にスペースを入れない事。変数名が「var 」として認識されたり @rem 格納される文字列が「 C:/home/document」になる set var=C:/home/document @rem %var:/=\% の :/=\が置換処理を指定している部分。 @rem :が処理指定開始の文字で=の左側で置換したい文字、 @rem 右側でどの文字に置換するか指定している set replace_var=%var:/=\% @rem C:\home\documentが出力される echo %replace_var% @rem "C:\home\document"が出力される echo "%replace_var%" pause
置換の結果を変数に格納する処理を何回か重ねれば
大抵の置換処理はなんとかなると思う。
割と使いそうなのはファイル名に日時を使う時の整形処理とか。