プログラマメモ2 - programmer no memo2

[java]郵便番号でソートされた、データファイルを作成する 2006/08/10
2006/11/26

シナリオ:

郵便局のホームページからCSVフォーマットで作成されたデータファイルを加工して別のデータファイルを作成する必要があります。



郵便局のホームページから住所の郵便番号のダウンロードします。

ダウンロードするファイルは、全国一括です。

CSVフォーマットなのですが、データ量が多くてマイクロソフトのエクセルで処理できませんでした。

で、簡単なプログラムを書いて、読み込ませて、出力します。



import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;

public class TestYubinbangouDatafileCreator {

public static final char DEFAULT_SEP = ',';

public static List parse(String line) {
List list = new ArrayList();
StringBuffer sb = new StringBuffer();
int i = 0;

if (line.length() == 0) {
list.add(line);
return list;
}

do {
sb.setLength(0);
if (i < line.length() && line.charAt(i) == '"') {
i = quoted(line, sb, ++i);
} else {
i = plain(line, sb, i);
}
list.add(sb.toString());
i++;
} while (i < line.length());

return list;
}

protected static int quoted(String s, StringBuffer sb, int i) {
int j;
int len = s.length();
for (j = i; j < len; j++) {
if (s.charAt(j) == '"' && j + 1 < len) {
if (s.charAt(j + 1) == '"') {
j++;
} else if (s.charAt(j + 1) == DEFAULT_SEP) {
j++;
break;
}
} else if (s.charAt(j) == '"' && j + 1 == len) {
break;
}
sb.append(s.charAt(j));
}
return j;
}

protected static int plain(String s, StringBuffer sb, int i) {
int j = s.indexOf(DEFAULT_SEP, i);
if (j == -1) {
sb.append(s.substring(i));
return s.length();
}
sb.append(s.substring(i, j));
return j;

}

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

TreeMap treeMap = new TreeMap();
String file = "/tmp/KEN_ALL.CSV";

BufferedReader reader = new BufferedReader(new FileReader(file));
String line = null;
StringBuffer buffer = new StringBuffer();
while ((line = reader.readLine()) != null) {
List list = parse(line);
String key = (String) list.get(2);
List list2 = new ArrayList();
list2.add(((String) list.get(0)).substring(0, 2));
list2.add(list.get(2));
list2.add(list.get(6));
treeMap.put(key, list2);
}

Iterator iterator = treeMap.keySet().iterator();
while (iterator.hasNext()) {
String key = iterator.next().toString();

List list = (List) treeMap.get(key);
buffer.append(((String) list.get(0)).substring(0, 2));
buffer.append(list.get(1));

System.out.println(list);
}

saveFile(new File("/tmp/datafile2.txt"), new String(buffer).getBytes());
}

static public void saveFile(File file, byte[] b) throws IOException {

OutputStream out = null;
try {
out = new FileOutputStream(file);
out.write(b);
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {

}
}
}
}
}


CSVを処理する部分は、適当にkodersでみつけたものを実装参考にしています。

もっと優雅にデータを加工したいものですね。

: