Java処理テキストファイルを読み込み処理結果を出力

11555 ワード

需要:最近会社の统计工事を引き継いで、地元のデータベースの中で1本のデータがないことを発见して、私の上司に私にここ数日のsqlの足どりを倒させて、10 Mぐらい、CSDNのよりずっと小さいです;しかし、インポート時にどうしてもインポートできません.確認してみると、すべてのデータ形式にテーブル名が付いていません.
INSERT INTO (id, stat_date, referrer, func, catid, user_type, action_stat, channel) VALUES (240092, "2012-3-6", "renren.com", -10, 11611, -10, 65:4.0;57:1.0;52:1.0", "-10");

INSERT INTO (id, stat_date, referrer, func, catid, user_type, action_stat, channel) VALUES(240093, "2012-3-6", "baidu.com", -1, 10587, -10, "65:273.0", "-10");

全部で6万件余りです.テーブル名を1つずつ追加するのにどのくらいかかりますか?すぐにプログラムで処理したいと思っています.VALuESの値さえあれば、sqlを使って一括挿入すれば実現できます.
sqlスクリプトの形式によって、VALuESの後ろの括弧の後の";"をカンマに変えて、最終的な形式は
(240092, "2012-3-6", "renren.com", -10, 11611, -10, "65:4.0;57:1.0;52:1.0", "-10"),
(240093, "2012-3-6", "baidu.com", -1, 10587, -10, "65:273.0", "-10"),
(240094, "2012-3-6", "baidu.com", -1, 10589, -10, "65:1040.0;57:6.0;52:10.0", "-10"),
(240095, "2012-3-6", "qq.com", -10, 11913, -10, "65:1.0", "channelId_846"),
(240096, "2012-3-6", "baidu.com", -1, 10581, -10, "65:1423.0;57:5.0;52:5.0", "-10"),
(240097, "2012-3-6", "baidu.com", -1, 10583, -10, "57:20.0;52:23.0;65:2823.0", "-10"),

これにより、変換後のスクリプトファイルの先頭に追加するだけです.
INSERT INTO t_xxx (id, stat_date, referrer, func, catid, user_type, action_stat, channel)
VALUES

データベースを一括挿入できます.以下はJavaIOプロセッサです.
    public static void main(String[] args) throws Exception{
BufferedReader in =new BufferedReader(new FileReader("D:\\sql.sql"));//
BufferedWriter br=new BufferedWriter(new FileWriter("D:\\aaa.sql"));//
String s = "";
Pattern pattern = Pattern.compile(".*[)][;]");// sql
Matcher m = null;
int i = 1;
while((s = in.readLine()) != null){
m = pattern.matcher(s);
if(m.matches()){
System.out.println(i++);
s = s.replace(");", "),");//
}
if(!s.matches(" *")){//
br.write(s);
br.write("
");
}
}
//
in.close();
br.flush();
br.close();
}

実行速度は速く、約2秒未満です.次にまた問題があります.このsqlの足どりに問題があるのではなく、6-7 Wのデータが一度に挿入されたので、mysqlは処理できません.自分でjdbcを書くことで実現できますが、このエクスポートされた実行可能なスクリプトファイルを読み込むには、いっそ手動で挿入しましょう.
INSERT INTO t_xxx (id, stat_date, referrer, func, catid, user_type, action_stat, channel) VALUES

データの先頭に追加して、5回も挿入しました.