`
ljjclub
  • 浏览: 35039 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

定时读取一个目录下文件数据存入oracle数据库(原创)

阅读更多
虽说很简单,但俺刚开始思路绕了,以此记之

package com.bj.save;

import java.io.File;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

import com.bj.util.DBUtil;

public class BackupData {
	
	
	
	/**
	 * 将读取出来的数据插入到数据库
	 * 
	 * @throws SQLException
	 */
	public void saveData(String localdir) throws SQLException {

		double begin = System.currentTimeMillis();
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			conn = DBUtil.getConnection();
			DBUtil.setAutoCommit(conn, false);// 设置自动提交
			File file = new File(localdir);
			if (file.isDirectory()) {
				System.out.println("读取文件夹中文件信息");
				int m = 0;
				File[] listFiles = file.listFiles();
				Map<String, File> latHashMap = new HashMap<String, File>();
				Map<String, File> t2HashMap = new HashMap<String, File>();
				Map<String, File> lonHashMap = new HashMap<String, File>();
				for (File file2 : listFiles) {

					// 把文件夹中所有的文件按日期分类
					String name = file2.getName();
					if (name.contains("lat")) {
						String substring = name.substring(3, name.length() - 4);
						/**
						 * StringBuffer s = new StringBuffer( substring);
						 * //文件名里面包含有小时s.insert(10, ": ");
						 */
						latHashMap.put(substring, file2);
					} else if (name.contains("t2")) {
						String substring = name.substring(2, name.length() - 4);
						t2HashMap.put(substring, file2);
					} else if (name.contains("lon")) {
						String substring = name.substring(3, name.length() - 4);
						lonHashMap.put(substring, file2);
					}
				}
				// 操作文件,把同日期的不同文件内容填入到对应的数据库表的字段中
				Set<Entry<String, File>> latEntrySet = latHashMap.entrySet();
				System.out.println("开始存入数据库");
				String dataKey = null;
				for (Entry<String, File> entry : latEntrySet) {
					dataKey = entry.getKey();
					File latFile = entry.getValue();
					File t2File = t2HashMap.get(dataKey);
					File lonFile = lonHashMap.get(dataKey);

					List<String> Xlist = ReadFile.getData(latFile.getPath());
					List<String> Ylist = ReadFile.getData(lonFile.getPath());
					List<String> WDlist = ReadFile.getData(t2File.getPath());

					for (int i = 0; i < (Xlist.size()); i++) {
						m++;
						ps = conn
								.prepareStatement("insert into Test(id,sb,x,y,wd) values"
										+ "(Test_ID.nextval,?,?,?,?)");
						ps.setString(1, dataKey);
						ps.setObject(2, Xlist.get(i));
						ps.setObject(3, Ylist.get(i));
						ps.setObject(4, WDlist.get(i));
						ps.addBatch();
						ps.executeBatch();

						if (i % 500 == 0 || i == Xlist.size() - 1) {
							conn.commit();
							ps.clearBatch();
						}
					}
					ps.close();
				}

				double end = System.currentTimeMillis();
				System.out.println("导入日常预测数据表" + m + "条记录用时" + (end - begin)
						+ "毫秒,平均存入每条记录用时" + ((end - begin) / m) + "毫秒");
			}
		} catch (Exception e) {
			conn.rollback();
			e.printStackTrace();
		} finally {
			conn.close();
		}
	}
}


	// 读取文件并获得文件中数据(我这里是netCDF格式数据集文件)
	public static List<String> getData(String readPath) throws IOException {

		File file = new File(readPath);
		BufferedReader br;
		br = new BufferedReader(new FileReader(readPath));
		String line;
		String[] strArr = null;
		List<String> list = new ArrayList<String>();
		Pattern p = Pattern.compile("^\\s*\\d.*");
		if (file.exists()) {

			int n = 1;
			while ((line = br.readLine()) != null) {
				n++;
				if (p.matcher(line).matches()) {
					strArr = line.replace(";","").replaceAll("\\s*", "").split(",");// 与文件中的分隔符要一致

					for (String data : strArr) {
						data.trim();
						list.add(data);
					}
				}
			}

		}
		br.close();
		return list;
	}


至于定时读取,用Quartz很简单的 0_0
1
1
分享到:
评论

相关推荐

    SpringBoot定时任务实现Oracle和mysql数据同步

    Spring Boot作为Java领域的一个热门微服务框架,提供了强大的定时任务功能,能够帮助我们实现不同数据库间的数据同步,比如Oracle到MySQL。本篇文章将详细讲解如何利用Spring Boot的定时任务特性,结合Java的相关...

    windows服务器读取aspen数据库数据

    本场景涉及的是通过Windows服务器来实现定时读取Aspen数据库中的数据,并将其存储到SQL数据库中,同时还会涉及到Oracle数据库的数据读取与保存。以下是对这个主题的详细解析: 1. **Windows服务器**:Windows ...

    EPICS控制系统中的Oracle数据库采集.pdf

    - **采集流程**:程序首先读取工作站上的配置文件,然后从Oracle数据库获取详细参数,通过CA从控制系统获取过程变量值,并利用Net8将数据存入Oracle数据库,然后进入下一轮采集。 2. **Oracle数据库设计** 设计...

    intouch 数据库连接显示.zip_AppStg.stg_intouch_intouchi

    4. **实时数据交换**:Intouch支持定时或事件触发的数据刷新,例如,每隔一段时间自动从数据库读取数据,或者在特定事件(如按钮点击)发生时写入数据。 5. **报警和历史记录**:Intouch可以记录和报警基于数据库...

    labview-data.zip_LabVIEW 数据库_labview 数据库_labview数据库_数据库

    在“labview-data.zip”这个压缩包中,包含了一份名为“边干边学数据库应用.pdf”的文件,这显然是一份关于LabVIEW与数据库交互的应用教程。下面,我们将深入探讨LabVIEW如何与数据库进行集成,以及在实际应用中可能...

    利用KEPSERVER6 实现写入SQLSERVER.docx

    1. 表示定时插入数据库,单位位 ms; 2. 表示当数据发生变更,插入数据库; ### 7. 启动 最后,我们需要启动 KEPSERVER6。步骤如下: 1. 点击“Disable log Group” 2. 点击“Enable Log Group” ### 8. 数据库...

    Oracle学习笔记

    当数据不在系统全局区(SGA)中,服务器进程会从数据文件中读取数据并将其存入SGA的数据高速缓冲区。共享服务器进程则服务于多个用户,提高了资源利用率,但可能增加服务器的管理复杂性。 **后台进程** 是Oracle...

    C#程序开发范例宝典(第2版).part08

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#程序开发范例宝典(第2版).part13

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#程序开发范例宝典(第2版).part02

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

    C#程序开发范例宝典(第2版).part12

    一部久享盛誉的程序开发宝典。精选570个典型范例,全面覆盖实用和热点技术,涉及面广,实用性强源于实际项目开发,帮助读者短时间掌握更多实用技术,提高编程水平范例经过精心编排,重点、难点突出,易学易懂书后...

Global site tag (gtag.js) - Google Analytics