急!!如何自动把.txt文件导入数据库?

结束意味着新的开始 2006-02-24 09:38:21
我每天9:00都需要把来自局域网(共享)的.txt文件按照一个固定模板(list.imp)方式导入PostgreSQL库中,请问,如果可以实现???急!!!!!!!提供的方法最好测试通过。谢谢
...全文
521 点赞 收藏 23
写回复
23 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
以上就是本人实现的,读文件,写入数据库没问题了。可没有加入计划任务(及没加控制时间执行的函数)。看看能不能用线程控制,毕竟用操作系统自带的计划任务,有局限性。谢谢大家的支持
回复
package news;

import com.dwj.db.connection.contextds.DBo;
import com.enterprisedt.net.ftp.FTPClient;
import com.enterprisedt.net.ftp.FTPException;

import java.io.*;
import java.util.Calendar;
import java.util.Date;


/**
* Created by IntelliJ IDEA.
* User: menglory
* Date: 2006-3-1
* Time: 10:48:01
* To change this template use File | Settings | File Templates.
*/
public class ReadFile {
// setCharacterEncoding("utf-8");
public static void main(String[] args) {

try {
int flag=1;
String sql;
int cs=0;
Date d = new Date();
Calendar calendar = Calendar.getInstance();

// java.util.Date d=new Date();
long ncurenntimes = d.getTime();
calendar.setTimeInMillis(ncurenntimes);

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; //注意:返回的月份是基于0的!
int day = calendar.get(Calendar.DAY_OF_MONTH);
String m = "0";
String r = "0";
if (month < 10) {
m = "0" + String.valueOf(month);
}
if (day < 10) {
r = "0" + String.valueOf(day);
}
String str;
str = String.valueOf(year) + m + r;
System.out.println(str);//时间格式:如20060305
String a;
String b;
a = "f:/dataBase/" + "shiye" + str + ".txt";
b = "shiye" + str + ".txt";

FTPClient ftp = new FTPClient("218.18.105.122"); //建立连接
ftp.login("shiye", "shi$ye"); //登录
ftp.get(a, b); //从FTP服务器下载文件

try {
String[] file;
String temp="";
BufferedReader in = new BufferedReader(new FileReader(a));
while ((temp = in.readLine()) != null) {
file = temp.split(",");

// for (int j = 0; j < file.length; j++) {
//
// temp = file[j];
// }
sql = "insert into database(ffhm,zjhm,fhd,bjhm,shsj,thsc,jfsc,jflb,jbhf,blzd,yhje,hdlb,fylb,xxid,ipcdm) values('"+file[0]+"','"+file[1]+"','"+file[2]+"','"+file[3]+"','"+file[4]+"','"+file[5]+"','"+file[6]+"','"+file[7]+"','"+file[8]+"','"+file[9]+"','"+file[10]+"','"+file[11]+"','"+file[12]+"','"+file[13]+"','"+file[14]+"')";

// DB db = new DB();//连接数据库
// try {
// int k=dbo.executeUpdate(sql);

if(false){//测试
System.out.println("成功-写入日志");
}else{
if(flag>0){
try {
BufferedReader in_flag = new BufferedReader(new FileReader("F:/dataBase/logs.txt"));
// PrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter("F:/dataBase/logs.txt")));
BufferedWriter out = new BufferedWriter(new FileWriter("F:/dataBase/logs.txt"));
str+=":导入数据库失败!";
flag=flag-2;
String c;
while((c=in_flag.readLine())!=null){
out.write(c+"\n\r");
// out.newLine();
}
out.write(str);
out.newLine();
in_flag.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}

}
// out.newLine();
}
// dbo.close();
// } catch (SQLException e) {
// e.printStackTrace();
// } catch (NamingException e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// } finally {
// try {
// db.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
}
in.close();

System.out.flush();
} catch (Exception e) {
System.out.println(e);
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
} catch (FTPException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}

回复
xiongbing528 2006-03-09
等下有时间给你提供个简单的代码
回复
wmzsl 2006-03-09
自己写一个程序不就好了!
回复
koma_wind 2006-03-09
c://data.txt 文件

1|222|qqq|111|
2|222|qqq|111|
3|222|qqq|111|
回复
koma_wind 2006-03-09
添加一个计划任务
看下面的代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.StringTokenizer;

/**
* @author Administrator
*
* To change the template for this generated type comment go to
* Window>Preferences>Java>Code Generation>Code and Comments
*/
public class TextInsert {

public static void main(String[] args){
//这个文件是 竖线相隔的文件 "aaa | aaaa| aaaa|
String writeFilePath = "c://data.txt";
FileReader fr = null;
BufferedReader br = null;
try {
fr = new FileReader(writeFilePath);
br = new BufferedReader(fr);
String Line;
while ((Line=br.readLine())!=null) {
StringTokenizer st1 = new StringTokenizer(Line, "|");
String[] SelectedCodeList = new String[st1.countTokens()];
String oneCode;
int i = 0;
while (st1.hasMoreTokens()) {
oneCode = st1.nextToken().trim();
SelectedCodeList[i] = oneCode;
i++;
}
String arg0 = SelectedCodeList[1].trim();
String arg1 = SelectedCodeList[2].trim();
String arg2 = SelectedCodeList[3].trim();
String strsql = "insert into demo values ('"+arg0+"','"+arg1+"','"+arg2+"')";
//执行数据库操作
//boolean isAdd = DatabaseBean.getUpdateResult(conn, strsql);

}
} catch (Exception e) {
e.printStackTrace();
}finally{
fr = null;
br = null;
}

}

}
回复
fjm_520 2006-03-08
学习
回复
zeq258 2006-03-08
学习下
回复
syp1979 2006-03-08
看到你上边的贴子说取得系统时间为标志.运行程序.其实也可用啊.只要在程序外加个条件.把执行插入操作的内容放到一个线程中也可以的.线程一直等待.一直取得系统时间.然后判断,如果等于9点那么此线程被唤醒执行插入操作.不过这样一直要启动另外一个线程监听.没有上一个方法好.
回复
syp1979 2006-03-08
读取和插入都写到一个java文件里啊.编译后不是可以用java XXXX运行吗?
现在就是定时的问题了啊.你可以写个a.bat内容是:
cd c:\aa
java InsertDataBase
第一句是dos命令进到你程序的目录啊.第二句是java xxxxx执行不就完了.
然后把这个a.bat加到windows的计划任务里.设置每天九点执行一次不就行了
回复
syp1979 2006-03-07
有道理。不过如何实现到了某个时钟程序执行呢
这还不简单.写个计划任务.执行a.bat
a.bat:

cd c:\aa
java InsertDataBase

InsertDataBase.java文件这个类中用IO读取txt文件.写入数据库就可以了啊.很简单啊.要代码十分钟可以搞定.
回复
menglory568 2006-03-07
没人提出意见,只有自己给自己送分了!哎
回复
?????????????
回复
我读取,和插入数据库的步骤都做好了。下面的具体该怎么样做呢?以前没做过,因此很茫然!!及a.bat里的内容该怎么样写?
回复
有点模糊啊。能不能给点这方面的例子呢???
回复
infowain 2006-02-24
这种批量导入一般都用数据库提供的导入工具比较快捷。
PostgreSQL我没用过,不过在网上找到以下一些说明:

备份、恢复、导出和导入工具
备份和恢复工具是可以得到的,但是有点原始。有导出工具(拷贝数据库表数据到一个文本文件),但是它们在功能上缺乏。没有导入工具,然而,因为数据库表作为常规文件系统的文件被存储,他们可以经由 PSQL命令行和cat命令被导入。我仍然不会介意看见多几个字节的磁盘空间花在一个外壳脚本上避免这个细节。当给出一个pg_dump实用程序,期望一个相应的pg_load似乎是合理的。
回复
ding
回复
自己顶一下
回复
有道理。不过如何实现到了某个时钟程序执行呢
回复
NightTree 2006-02-24
以本机时间或者服务器时间为准都行啊,不放心得话可以一小时同步一次时间,然后到了指定时间比如早上8点就执行导入数据,需要注意的就是要保证要么全部插入数据,要么全部都不插入,保证数据的完整性,然后整一个成功和失败的列表就是了,每天自动插入成功与否一目了然。。。
回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2006-02-24 09:38
社区公告
暂无公告