テキストの各行をキーと値に分離し、複数テキストファイルを読み込み、キーを突き合わせ照合し、その結果を表示するGUIユーテリティです。
リビジョン | 05f45330c90be2bc4303f5b7228d87209e9542fb (tree) |
---|---|
日時 | 2011-10-16 18:21:09 |
作者 | seraphy <seraphy@dime...> |
コミッター | seraphy |
・空行を読み飛ばすように修正
・コメント追加
@@ -10,8 +10,18 @@ package textkeymatcher.entity; | ||
10 | 10 | */ |
11 | 11 | public interface Columns { |
12 | 12 | |
13 | + /** | |
14 | + * 有効な列数 | |
15 | + * @return 列数 | |
16 | + */ | |
13 | 17 | int getSize(); |
14 | 18 | |
19 | + /** | |
20 | + * 指定したインデックスの列データを取得する.<br> | |
21 | + * 該当するインデックスがない場合は空文字が返されます.<br> | |
22 | + * @param colIndex インデックス | |
23 | + * @return 列データ、もしくは空文字 | |
24 | + */ | |
15 | 25 | String getAt(int colIndex); |
16 | 26 | |
17 | 27 | } |
@@ -12,6 +12,11 @@ import textkeymatcher.entity.Columns; | ||
12 | 12 | */ |
13 | 13 | public interface ColumnSplitter { |
14 | 14 | |
15 | + /** | |
16 | + * 文字列行を列データとして切り出す.<br> | |
17 | + * @param line 文字列行 | |
18 | + * @return 切り出された列データ | |
19 | + */ | |
15 | 20 | Columns splitColumns(String line); |
16 | 21 | |
17 | 22 | } |
@@ -4,20 +4,31 @@ | ||
4 | 4 | */ |
5 | 5 | package textkeymatcher.service; |
6 | 6 | |
7 | +import org.apache.commons.lang3.StringUtils; | |
7 | 8 | import textkeymatcher.entity.Columns; |
8 | 9 | import textkeymatcher.entity.LineData; |
9 | 10 | |
10 | 11 | /** |
11 | - * | |
12 | + * 既定の文字列行から行データを構築するラインデータビルダー.<br> | |
12 | 13 | * @author seraphy |
13 | 14 | */ |
14 | 15 | public class DefaultLineDataBuilder implements LineDataBuilder { |
15 | 16 | |
17 | + /** | |
18 | + * 列を切り出すスプリッタ | |
19 | + */ | |
16 | 20 | private ColumnSplitter splitter; |
17 | 21 | |
22 | + /** | |
23 | + * キーの列位置 | |
24 | + */ | |
18 | 25 | private int keyColumn; |
19 | 26 | |
27 | + /** | |
28 | + * 値の列位置 | |
29 | + */ | |
20 | 30 | private int valueColumn; |
31 | + | |
21 | 32 | |
22 | 33 | public DefaultLineDataBuilder(ColumnSplitter splitter, int keyColumn, int valueColumn) { |
23 | 34 | if (splitter == null) { |
@@ -32,6 +43,7 @@ public class DefaultLineDataBuilder implements LineDataBuilder { | ||
32 | 43 | public LineData parse(String line) { |
33 | 44 | Columns cols = splitter.splitColumns(line); |
34 | 45 | |
46 | + // キー列の取得 | |
35 | 47 | String key; |
36 | 48 | if (keyColumn >= 0) { |
37 | 49 | key = cols.getAt(keyColumn); |
@@ -39,6 +51,14 @@ public class DefaultLineDataBuilder implements LineDataBuilder { | ||
39 | 51 | key = line; |
40 | 52 | } |
41 | 53 | |
54 | + // 列数1以下でキー列が空であれば無効な行とする. | |
55 | + if (cols.getSize() <= 1) { | |
56 | + if (StringUtils.isBlank(key)) { | |
57 | + return null; | |
58 | + } | |
59 | + } | |
60 | + | |
61 | + // 値 | |
42 | 62 | String value; |
43 | 63 | if (valueColumn >= 0) { |
44 | 64 | value = cols.getAt(valueColumn); |
@@ -7,12 +7,17 @@ package textkeymatcher.service; | ||
7 | 7 | import textkeymatcher.entity.LineData; |
8 | 8 | |
9 | 9 | /** |
10 | - * | |
10 | + * 行データを解析しラインデータを構築します.<br> | |
11 | 11 | * @author seraphy |
12 | 12 | */ |
13 | 13 | public interface LineDataBuilder { |
14 | 14 | |
15 | - | |
15 | + /** | |
16 | + * 行を解析し、ラインデータを返します.<br> | |
17 | + * コメントや空行など有効なラインデータでない場合はnullを返します.<br> | |
18 | + * @param line 行データ | |
19 | + * @return ラインデータ | |
20 | + */ | |
16 | 21 | LineData parse(String line); |
17 | 22 | |
18 | 23 | } |
@@ -16,14 +16,20 @@ import java.nio.charset.Charset; | ||
16 | 16 | import textkeymatcher.entity.LineData; |
17 | 17 | |
18 | 18 | /** |
19 | - * | |
19 | + * 文字列を読み取り、行をカラムに分解して{@link LineData}に変換しコールバックに引き渡すローダー.<br> | |
20 | 20 | * @author seraphy |
21 | 21 | */ |
22 | 22 | public class LineDataLoader { |
23 | 23 | |
24 | - | |
24 | + /** | |
25 | + * ラインデータを受け取るコールバック | |
26 | + */ | |
25 | 27 | public interface LineDataLoaderCallback { |
26 | 28 | |
29 | + /** | |
30 | + * 解析結果のラインデータを受け取ります.<br> | |
31 | + * @param line ラインデータ | |
32 | + */ | |
27 | 33 | void fetch(LineData line); |
28 | 34 | |
29 | 35 | } |
@@ -49,7 +55,10 @@ public class LineDataLoader { | ||
49 | 55 | String line; |
50 | 56 | while ((line = br.readLine()) != null) { |
51 | 57 | LineData lineData = builder.parse(line); |
52 | - callback.fetch(lineData); | |
58 | + if (lineData != null) { | |
59 | + // 有効なラインデータのみ結果を引き渡す. | |
60 | + callback.fetch(lineData); | |
61 | + } | |
53 | 62 | } |
54 | 63 | |
55 | 64 | } finally { |