2008年12月19日

正規表現でCSVパース


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Sample2 {

public static void main(String[] args) throws Exception {

String str = "47201,\"90101\",\"9,010154\",\"オキナワケン\",\"ナハシ\",\"アカミネ\",\"沖縄県\",\"那\"\"覇市\",\"赤嶺\",0";

// 1. 基本的にコンマで区切った部分がスペースを含めて値である.
// 2. 値にコンマやダブルクウォートが含まれる場合は, 値全体をダブルクウォートで囲む.
// 3. 値に含まれるダブルクウォートは "" となる.
//※値の中に改行コードがあるデータは対象外です。

//処理を容易にするために末尾にカンマを付与します。
str = str.replaceAll("(?:\\x0D\\x0A|[\\x0D\\x0A])?$", ",");

Pattern pattern = Pattern.compile("(\"[^\"]*(?:\"\"[^\"]*)*\"|[^,]*),");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {

//正規表現パターンにマッチしたグループ1(括弧に括られている所)を取得
String s = matcher.group(1);

//"値"→値にトリミング & 値中の""を"に変換してから格納
s = s.replaceAll("^\"(.*)\"$", "$1");
s = s.replaceAll("\"\"", "\"");
System.out.println(s);
}

}
}


47201
90101
9,010154
オキナワケン
ナハシ
アカミネ
沖縄県
那"覇市
赤嶺
0
posted by 台北猫々 at 21:58| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年09月16日

正規表現で、渡された文字列に非ASCII文字があるか?のチェック(Java編)


/**
* 文字列にASCII文字でない文字が存在するか?
* 参考:
* http://www.unicode.org/charts/PDF/U0000.pdf
*/

private static final String P_NOT_ASCII = ".*[^\\u0020-\\u007E].*";


/**
* 半角ASCIIでない文字があるか
* @param str チェック対象文字列
* @return 半角ASCIIでない文字がある:true ない:false
*/

public static boolean existNotAscii(String str) {
return str.matches(P_NOT_ASCII);
}

posted by 台北猫々 at 21:51| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年06月21日

Javaで階層のあるディレクトリを走査する

Javaの場合は、やはりEclipseの存在が大きいですね。Rubyなどに比べると書くコード量は多いですが、Eclipseによる入力支援・リファクタリング支援もコミで考えると、やっぱり生産性が高い言語です。


import java.io.File;
import org.apache.commons.lang.StringUtils;

public class MyWalk {

public static void main(String[] args) {
MyWalk m = new MyWalk();
m.search( new File("C:\\usr\\local\\share"), 0 );
}

private void search(File dir, int depth) {
String[] filenames = dir.list();
for( String name : filenames ) {

File fobj = new File(dir.getPath() + File.separator + name);

if( fobj.isFile() ) {
System.out.println(StringUtils.repeat("\t", depth) + fobj.getPath());
} else if( fobj.isDirectory() ) {
System.out.println(StringUtils.repeat("\t", depth) + fobj.getPath() + "/");
search(fobj, depth + 1);
}
}
}

}



org.apache.commons.lang.StringUtils#repeat
は、
http://commons.apache.org/downloads/download_lang.cgi
のライブラリを使用しています。
posted by 台北猫々 at 21:30| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年06月05日

正規表現で、文字列は全て全角ASCIIか?のチェック(Java編)


/**
* 文字列が「全角ASCII文字」のみか?
* 参考:
* http://www.unicode.org/charts/PDF/UFF00.pdf
*/

private static final String P_FULLWIDTH_ASCII_ONLY = "^[\\uFF01-\\uFF60]+$";

/**
* 全て全角ASCII文字か?
* @param str チェック対象文字列
* @return はい:true いいえ:false
*/

public static boolean isFullWidthAsciiOnly(String str) {
return str.matches(P_FULLWIDTH_ASCII_ONLY);
}
posted by 台北猫々 at 23:50| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年05月22日

正規表現で、文字列は全て半角カタカナか?のチェック(Java編)


/**
* 文字列が「半角カタカナ」のみか?
* 参考:
* http://www.unicode.org/charts/PDF/U3040.pdf
*/

private static final String P_HALF_KATAKANA_ONLY = "^[\\uFF65-\\uFF9F]+$";
/**
* 全て半角カタカナか?
* @param str チェック対象文字列
* @return はい:true いいえ:false
*/

public static boolean isHalfKatakanaOnly(String str) {
return str.matches(P_HALF_KATAKANA_ONLY);
}

posted by 台北猫々 at 21:27| Comment(1) | TrackBack(0) | 技術メモ(Java)

2008年04月30日

正規表現で、文字列は全て全角カタカナか?のチェック(Java編)


/**
* 文字列が「カタカナ」のみか?
* 参考:
* http://www.unicode.org/charts/PDF/U30A0.pdf
*/

private static final String P_KATAKANA_ONLY = "^[\\u30A0-\\u30FF]+$";

/**
* 全てカタカナか?
* @param str チェック対象文字列
* @return はい:true いいえ:false
*/

public static boolean isKatakanaOnly(String str) {
return str.matches(P_KATAKANA_ONLY);
}

posted by 台北猫々 at 20:07| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年04月10日

ファイルダウンロード処理(Java)

Javaでファイルダウンロードを行います。


import java.io.File;
import java.io.IOException;
import java.io.FileInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.net.HttpURLConnection;
import java.net.SocketException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadFile extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse res)
throws ServletException, IOException {

File file = new File("c:\\sample.pdf");
BufferedInputStream in = null;
BufferedOutputStream out = null;
try {
//HTTPヘッダの出力
res.setContentType("application/octet-stream");
res.setHeader("Content-disposition", "attachment; filename=\"" + file.getName() + "\"");
res.setContentLength((int)file.length());
res.setHeader("Expires", "0");
res.setHeader("Cache-Control", "must-revalidate, post-check=0,pre-check=0");
res.setHeader("Pragma", "private");

in = new BufferedInputStream(new FileInputStream(file));
out = new BufferedOutputStream(res.getOutputStream());

byte buf[]=new byte[1024];
int len;
while((len=in.read(buf))!=-1){
out.write(buf,0,len);
}
} catch (SocketException e) {
//●ダウンロード処理中にダウンロードダイアログの「キャンセル」が
//クリックされた場合の例外。
//●ただし、ダウンロードダイアログが表示されているバックグラウンドで
//ブラウザへのダウンロードが行われていることに留意すること。
//●つまり小さいファイルでは、ダイアログが表示される時には、ダウンロード
//処理は完了し、サーブレットは終了してしまっており、SocketExceptionの
//も発生しないということです。
} catch (Exception e) {
//ファイルダウンロード用のHTTPヘッダをリセットします。
res.reset();
res.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR , e.toString());
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.flush();
out.close();
}
}
return;
}
}


posted by 台北猫々 at 08:00| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年04月04日

正規表現で、文字列は全てASCII文字か?のチェック(Java編)


/**
* 全てASCII文字か?
* @param str チェック対象文字列
* @return はい:true いいえ:false
*/

public static boolean isAsciiOnly(String str) {
return str.matches("^[\\u0020-\\u007E]+$");
}




良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:38| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年02月08日

テキストファイル読み込み処理雛形

Javaでテキストファイルを1行づつ読み込む処理の雛形です。



import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReadSkelton {

public void read(File file) throws Exception {

BufferedReader in = null;
try{
in = new BufferedReader(new FileReader(file));
String line;
while( (line=in.readLine() ) !=null ) {
System.out.println("行データ:" + line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
throw new Exception("ファイルがありません" + file.getPath() );
} catch(Exception e){
e.printStackTrace();
throw e;
}finally{
try {
if( in != null ) {
in.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}




良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 18:51| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年01月23日

Windows環境のJavaでドライブ名のリスト

昔にWindows環境のJavaでドライブリスト(C:\\, D:\\・・)の取得の仕方を調べていて、

FileSystemView fileSystemView = FileSystemView.getFileSystemView();
File[] roots = fileSystemView.getRoots();

とすれば、とれるというWeb情報があったので、試して、だけど駄目で諦めていたのですが、先日ひょっこり方法を見つけました。

なんのことはない、Fileクラスのメソッドにあるのですね。


import java.io.File;

public class GetRoot {

/**
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド・スタブ
File[] roots = File.listRoots();
for( File f : roots ) {
System.out.println(f.getPath());
}
}

}
posted by 台北猫々 at 20:27| Comment(0) | TrackBack(0) | 技術メモ(Java)

2008年01月17日

正規表現で「英数字」の存在チェック

String s = "あいうえおかきaくあけ";
String reg = ".*[A-Za-z].*";
System.out.println("「英数字」はあるか?"+(s.matches(reg)?"はい":"いいえ"));

「はい」
と、なります。

パターンの前後の".*"がないと、期待通りにならないのですよね。PHPの正規表現とは違うようですね。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 19:58| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年12月29日

Static Import

この前調べ物をしていて偶然知ったのですが、staticメンバに対して非修飾でアクセスする方法があるのですね(Java5から導入された)

従来は↓のようにするところが、
double r = Math.cos(Math.PI * theta);

import static java.lang.Math.*;
のようにすることにより、

double r = cos(PI * theta);
というように記述することができるようになります。
ソースがすっきりしますね。

ただ、参照ページにもありますが、名前空間が分からなくなるので、多用するとソースの可読性が非常に低下する危険性があるであろうと思われ。多分通常の開発では規約で使用禁止になるかもしれませんね。

使い所を誤らなければ便利かと思います。猫

参照ページ:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/language/static-import.html


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 11:02| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年12月03日

方程式計算なんかしてみました


/**
* 方程式計算
* @param coefficients 次数の大きいものからの係数の配列
* @param x 変数
* @return 結果
* 3x^2+2x-2ならば、double[] coefficients = {3,2,-1};となる
*/
static public double calculateEquation( double[] coefficients, double x ) {

double result = 0;
int powNum = coefficients.length - 1;
for( int i=0 ; powNum>=0 ; powNum--, i++ ) {
result += coefficients[i] * Math.pow(x, powNum);
}
return result;
}


2007.12.04 そっとint result→double resultにしました
posted by 台北猫々 at 21:12| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年12月02日

線形最小二乗法での傾き算出処理


/**
* 線形最小二乗法での傾き算出処理.
* @param x_val X軸方向の値の配列.
* @param y_val Y軸方向の値の配列.
* @return 傾きを戻します。.
*/
static public double calulateGradientByLinearLeastSquares(double x_val[], double y_val[]) {

double x_sum = 0;
for( double d : x_val ) {
x_sum += d;
}

int num = x_val.length;
double x_avg = x_sum/num;
double tmp = 0;
for( double d : x_val ) {
tmp += Math.pow( d - x_avg, 2 );
}

double y_sum = 0;
for( double d : y_val ) {
y_sum +=d;
}

double y_avg = y_sum/num;
double xt = 0;
for (int i = 0; i < num; i++) {
xt += ( x_val[i] - x_avg ) * (y_val[i] - y_avg);
}
return( xt/tmp );
}
posted by 台北猫々 at 20:56| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年12月01日

標準偏差取得


/**
* 標準偏差取得.
* @param val 値の配列
* @return 標準偏差.
*/
static public double calulateSTDEV( double[] val ){
double sum = 0.0;
double avg = calulateAVG( val );

for( double d : val ) {
sum += ( d - avg ) * ( d - avg );
}
return Math.sqrt( sum/(val.length-1) );
}

※「calulateAVG」は↓
http://programmer-toy-box.sblo.jp/article/7353224.html
posted by 台北猫々 at 23:34| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年11月29日

平均値取得


static public double calulateAVG( double[] val ) {
double sum = 0;
for( double d : val ) {
sum += d;
}
return sum/val.length;
}
posted by 台北猫々 at 21:29| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年11月26日

phpのimplode関数みたいな


public static String implode(String glue, String[] pieces) {
StringBuffer buf = new StringBuffer();
for( int i=0; ; i++ ) {
buf.append(pieces[i]);
if( i == pieces.length -1 ) {
break;
}
buf.append(glue);
}
return buf.toString();
}
posted by 台北猫々 at 21:15| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年11月21日

現在日付取得、フォーマット指定

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd (EEE) HH:mm:ss");
String str = sdf.format(new Date());
System.out.println(str);



2007/11/21 (水) 21:38:05
posted by 台北猫々 at 21:39| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年11月19日

空文字列を無視しない文字列分割

StringTokenizerクラスやC言語のstrok関数でも似たようなことがあるのですが、、、

String str = ",2,3,,";
String[] strs = str.split(",");

要素数は3つになります。
strs[0]・・・""
strs[1]・・・"2"
strs[2]・・・"3"
後続の空文字列は無視される仕様ということなのです。
これって、不便なことが多いのですよね。今までは、文字列分割処理を自作していました。

ところが、実は便利なメソッドがあることを今日しりました。

String str = ",2,3,,";
String[] strs = str.split(",",5);

要素数は5つになります。
strs[0]・・・""
strs[1]・・・"2"
strs[2]・・・"3"
strs[3]・・・""
strs[4]・・・""
splitメソッドの第二引数は「期待する要素数」ということになります。

これは地味に助かります。ぐっじょぶ!猫

posted by 台北猫々 at 21:58| Comment(0) | TrackBack(0) | 技術メモ(Java)

2007年11月13日

ファイル名から拡張子を除きます。

    
public String removeExt(String file) {
int pos = file.lastIndexOf('.');
if (pos == -1) {
return file;
} else if (pos == 0) {
//先頭が「.」なら、そのまま返す
return file;
}
return file.substring(0, pos);
}
posted by 台北猫々 at 22:34| Comment(0) | TrackBack(0) | 技術メモ(Java)