naoyuki1019 2013-05-18 04:46:38

[Java] スプリット(笑) このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

header.txtというファイルがある。
レコード区切りがタブ"\t"でカラムの区切りが","となっている。
カラムは[コード,名称]となっている。

例) 01,受注\t02,発注\t03,入金\t04,出金\t05,発送

上記文字列をkaiseki(笑)してコード部の配列[01, 02, 03, 04, 05]を作成したい模様。

//ファイル読み込み処理は別で投稿予定。
//String Head = hoge_method("header.txt")
String Head = "01,受注"+"\t"+"02,発注"+'\t'+"03,入金"+'\t'+"04,出金"+'\t'+"05,発送";

String codehead[] = null;
int xmax = IndexMax(Head, '\t', 1);

if(xmax > 0) {
    String str = "";
    codehead = new String[xmax];
    for(int i=0; i<xmax; i++) {
        str = Kaiseki(Head, i + 1, '\t');
        codehead[i] = Kaiseki(str, 1, ',');
    }
}

//[01, 02, 03, 04, 05]
System.out.print(Arrays.asList(codehead));


//===============================================================
//指定された区切り文字で区切った文字列の数
//===============================================================
public static int IndexMax(String st, char ch, int flg) {
    int num = 0;
    if(flg == 0) {
        //対象の文字列が空白になるまでの文字列数
        while(Kaiseki(st, num + 1, ch).length() !=0 ) {
            num++;
        }
    }
    else {
        //対象の文字列の区切った文字列数
        if(st.length() != 0) {
            while(st.indexOf(ch) != -1) {
                num++;
                st = st.substring(st.indexOf(ch) + 1);
            }
            num++;
        }
    }
    return num;
}


//===============================================================
//指定された区切り文字で区切った文字列の数
//===============================================================
public static String Kaiseki(String st, int number, char ch) {
    String str=st,str2="";
    int num = 0;

    if(st.length() != 0) {
        for(int i=0; i<number; i++) {
            str = str.substring(num);
            if(str.indexOf(ch) == -1) {
                if(i == number - 1) str2 = str;
                else {
                    break;
                }
            }
            else {
                str2 = str.substring(0, str.indexOf(ch));
                num = str.indexOf(ch) + 1;
            }
            if(i != number - 1) str2 = "";
        }
    }
    return str2;
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(17)

#2 token7 2013-05-18 05:38:06  

どこが臭いのか分からないくらいの臭気だわ。5行くらいで終わるのに。

#3 keiichiroh 2013-05-20 12:15:30  

つ System.out.println(Arrays.asList(Head.split(",[^\t]*(\t|$)")));

#4 panzer_jagdiron 2013-05-21 10:59:51  

Arrays.asListを知っているレベルなのになんでCSV読み込みライブラリを使わないのか

#5 panzer_jagdiron 2013-05-21 11:02:04  

ファイル読み込みぐらい書けよ…

#9 InternalServerE 2013-05-27 13:42:38  

> System.out.println(Arrays.asList(Head.split(",[^\t]*(\t|$)")));
これはこれで別の意味でウンコードのような。。

#10 keiichiroh 2013-06-01 10:01:40  

CSVなんてクソデータじゃそれで充分。そもそもCSVなんてものはバズワードだし。このデータは",[^\t]*(\t|$)"という区切りで分けられた値だから巷のクソデータライブラリで分割できるのなんてあるのか?openCSV(笑)

#11 InternalServerE 2013-06-01 11:49:52  

ええと。。
色々あるけど、さしあたっては「これのどこがCSV形式?」とだけ言ってみよう。うん、そうしよう。

#12 keiichiroh 2013-06-01 15:23:03  

解釈としてEOLを'\t'、区切りを','としたCSV形式になるかなこれは。正確にはCSVなんてデータ形式は存在せず、文字列の解釈の決め方に過ぎないわけで、文字列の解釈ならば正規表現万能ひゃっほー

#13 keiichiroh 2013-06-01 15:35:05  

あ、一行目をデータではなくフィールド名称とするって眷属もいるから、そういうのはデータ形式って言ってもいいのか?
ともかく今時なら、属性使いたいかDOMしか無かったならXML、単にデータを入れるだけならJSONだよな。
CSVとかpropertiesなんて前世紀の負の遺産、早く死ねばいいのに(私情)

#14 InternalServerE 2013-06-02 05:57:35  

まあ、一言で言うと、あれかな。
ずいぶん低空飛行だね、君。

#15 keiichiroh 2013-06-04 00:29:04  

ん?コードそっちのけで俺の事しかコメント無いのか。
はっはっはっ、照れるなw

#16 kuma056 2013-06-04 08:48:47  

勝手な予想ですけど、XMLとかJSONとかだったら、この人はもっと複雑怪奇なkaisekiメソッドを作るような気がする。 ついでに、「//ファイル読み込み処理は別で投稿予定」の部分で、XMLとかJSONとか改行区切りのCSVとか等の別の形式から、わざわざ今回のカンマとタブ区切りに変形しているような予感がする。

#17 sharo0331pc 2013-06-28 03:11:31  

この程度ならiniの方が扱いやすいと思うけど、ヘッダだけでこんなに大量にコード書くのね

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[Java] is禁止令

このエントリーをはてなブックマークに追加

ウンコードの趣旨とは違い、レビューで指摘...

// Mod yamada Start

// 一般的に考えて真偽値を返すメ...

鑑賞する »

[Java] 内部的にunicodeだから日本語つかえ...

このエントリーをはてなブックマークに追加

これを書いた先輩に「英語で書きましょうよ...

class 会員 {
    private int 会員番号;
    p...

鑑賞する »

[Java] 専用機

このエントリーをはてなブックマークに追加

山田さん(仮名)専用機らしいことがクラス...

/**
 * My Army Knife
 * 20XX/XX/XX
 *...

鑑賞する »