`

根据"|",大容量插入数据

    博客分类:
  • java
 
阅读更多

50万数据9秒插完,前提是把mysql的执行SQL大小设大点。jvm的虚拟也大点

 

package com.ikea.utils;

import java.io.BufferedReader;

public class InsertMember {
	public static String encodin = "UTF8";
	
	
	public static void main(String[] args) {
		System.out.println(new Date());
		Connection conn = null;
		List<String[]> dataList = linePaser("D://document//wunderman//ikea//database//ikea_sftp//ikea_member_email_final//11.txt");
		String sql = getSQL(dataList);
//		insert into member (cst_id, cst_membershipnum, cst_name, cst_firstname, cst_email, cnt_code) values (1,1,1,1,1,1),(2,2,2,3)
		String url = "jdbc:mysql://localhost:3306/test";
		String username = "root";
		String password = "root";
		//加载驱动程序以连接数据库
		try {
			Class.forName("org.gjt.mm.mysql.Driver");
			conn = DriverManager.getConnection(url, username, password );
			PreparedStatement pstmt = conn.prepareStatement(sql);
			String[] lines;
			for (int i = 0; i < dataList.size(); i++) {
				lines = dataList.get(i);
				if(lines.length == 6) {
					pstmt.setString(i * 6 + 1, lines[0].equals("NULL") ? null : lines[0] );
					pstmt.setString(i * 6 + 2, lines[1].equals("NULL") ? null : lines[1] );
					pstmt.setString(i * 6 + 3, lines[2].equals("NULL") ? null : lines[2] );
					pstmt.setString(i * 6 + 4, lines[3].equals("NULL") ? null : lines[3] );
					pstmt.setString(i * 6 + 5, lines[4].equals("NULL") ? null : lines[4] );
					pstmt.setString(i * 6 + 6, lines[5].equals("NULL") ? null : lines[5] );
				}
			}
			int result = pstmt.executeUpdate();
			System.out.println(result);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.println(new Date());
	}
	
	
	public static String getSQL(List<String[]> dataList) {
		StringBuilder sql = new StringBuilder()
		.append(" INSERT INTO _member (cst_id, cst_membershipnum, cst_name, cst_firstname, cst_email, cnt_code) VALUES ");
		String[] lines = null;
		for (int i = 0; i < dataList.size(); i++) {
			lines = dataList.get(i);
			if(lines.length == 6) {
				sql.append(" ( ");
				for (int j = 0; j < lines.length; j++) {
					sql.append(" ? ");
					if(j < lines.length - 1) {
						sql.append(" , ");
					}
					if(j == lines.length - 1) {
						sql.append(" ) ");
					}
				}
				if(i < dataList.size() - 1) {
					sql.append(" , ");
				}
			} else {
				System.out.println("行数:"+ i + "data: " + lines[0]);
			}
		};
		return sql.toString();
	}
	
	
	
	private static String[] splitLine(String src) throws Exception {
		if (src == null || src.equals(""))
			return new String[0];

		StringBuffer st = new StringBuffer();
		Vector<String> result = new Vector<String>();
		boolean beginWithQuote = false;
		for (int i = 0; i < src.length(); i++) {
			char ch = src.charAt(i);
			if (ch == '\"') {
				if (beginWithQuote) {
					i++;
					if (i >= src.length()) {
						result.addElement(st.toString());
						st = new StringBuffer();
						beginWithQuote = false;
					} else {
						ch = src.charAt(i);
						if (ch == '\"') {
							st.append(ch);
						} else if (ch == '|') {
							result.addElement(st.toString());
							st = new StringBuffer();
							beginWithQuote = false;
						} else {
							throw new Exception(
									"Single double-quote char mustn't exist in filed "
											+ (result.size() + 1)
											+ " while it is begined with quote\nchar at:"
											+ i);
						}
					}
				} else if (st.length() == 0) {
					beginWithQuote = true;
				} else {
					throw new Exception(
							"Quote cannot exist in a filed which doesn't begin with quote!\nfield:"
									+ (result.size() + 1));
				}
			} else if (ch == '|') {
				if (beginWithQuote) {
					st.append(ch);
				} else {
					result.addElement(st.toString());
					st = new StringBuffer();
					beginWithQuote = false;
				}
			} else {
				st.append(ch);
			}
		}
		if (st.length() != 0) {
			if (beginWithQuote) {
				throw new Exception(
						"last field is begin with but not end with double quote");
			} else {
				result.addElement(st.toString());
			}
		}
		String rs[] = new String[result.size()];
		for (int i = 0; i < rs.length; i++) {
			rs[i] = (String) result.elementAt(i);
		}
		return rs;
	}

	public static ArrayList<String[]> linePaser(String fileName) {
		// BufferedReader br;
		ArrayList<String[]> dataList = new ArrayList<String[]>();
		try {
			//FileInputStream fis = new FileInputStream(fileName);
			//InputStreamReader isr = new InputStreamReader(fis, encodin);
			//BufferedReader br = new BufferedReader(isr);
			BufferedReader br = null;
			br = new BufferedReader(new FileReader(fileName));
			String rec;
			String[] ret;
			int count = 0;
			while ((rec = br.readLine()) != null) {
				count ++ ;
				if(rec.endsWith("cnt_code") || rec.startsWith("(")) {
					System.out.println("过滤提示信息" + rec);
				} else {
					ret = splitLine(rec);
					if(ret.length != 6) {
						if(ret.length == 0) {
							System.out.println("数据过滤不是6个字段的数据。空行");
						} else {
							System.out.println("数据过滤不是6个字段的数据。第" + count + "行  " + rec);
						}
						
					} else {
						dataList.add(ret);
					}
				}
			}
			br.close();
			//isr.close();
			//fis.close();
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return dataList;
	}
	
}
 
分享到:
评论

相关推荐

    BCP插入大容量数据

    ### BCP插入大容量数据详解 #### 背景与问题描述 在处理大量数据时,数据库性能常常成为瓶颈之一。本案例中的场景是,在一个包含6千万条记录的表中,由于数据量巨大,直接在某字段上创建索引的操作无法顺利完成。...

    C#处理大容量数据,及多线程简单应用

    如果需要批量插入数据,`SqlBulkCopy`类提供了一个便捷的方式。 总结来说,处理大容量数据和多线程应用是C#开发中的核心技能。通过合理利用多线程、优化SQL查询和采用高效的数据库操作方法,我们可以构建出高性能、...

    (数据结构)线性表的插入删除

    之后,用户可选择执行插入或删除操作,根据提示输入位置和(插入时的)新数据,系统将相应地调用`listinsert`或`listdelete`函数。 ### 总结 通过对线性表构建、插入与删除操作的深入解析,我们了解到这些基本操作...

    在vector和list中插入数据

    本文将深入探讨在`vector`和`list`中插入数据的方法、性能差异以及适用场景。 **一、std::vector** `std::vector`是一个动态数组,提供了随机访问的能力。它的插入操作主要有以下几种: 1. **在末尾插入元素**: `...

    SqlBulkCopy批量插入海量数据

    SqlBulkCopy类提供了类似数据库大容量加载的功能,它能显著提高数据插入的速度,尤其适用于处理百万级乃至千万级的数据量。 首先,SqlBulkCopy是System.Data.SqlClient命名空间下的一个类,它的主要功能就是实现...

    线性表实现插入删除数据

    根据给定的文件信息,我们可以总结出以下关于“线性表实现插入删除数据”的关键知识点,这些知识主要涉及C语言中的线性表操作,包括初始化、添加元素、合并线性表、插入元素、删除元素以及查找元素等核心功能。...

    c语言数据结构线性表创建删除插入

    在IT领域,C语言是一种广泛使用的...理解并熟练掌握线性表的创建、插入和删除操作是学习C语言数据结构的重要步骤,这将有助于进一步学习更复杂的算法和数据结构。通过实践,你可以更好地理解这些概念,并提升编程能力。

    各个基本算法实现代码:选择排序_插入排序_冒泡排序_归并排序_堆排序_基数排序_大容量文件数据排序__sort.zip

    各个基本算法实现代码:选择排序_插入排序_冒泡排序_归并排序_堆排序_基数排序_大容量文件数据排序__sort

    SQL Server2000最大容量说明

    即使使用可变长度的列定义键,只要不插入超过 900 字节的数据,其实际大小可以超过此限制。 - **对象个数限制**:数据库对象包括所有表、视图、存储过程、扩展存储过程、触发器、规则、默认值及约束等。一个数据库中...

    Vector最大容量

    了解`vector`的最大容量可以帮助我们设计更高效、更健壮的程序,尤其是在处理大数据集或内存受限的环境中。同时,合理地预测和控制`vector`的容量可以减少不必要的内存拷贝和提高性能。 总之,`vector`的最大容量是...

    大容量编辑器

    标题中的“大容量编辑器”指的是专为处理大型文件而设计的文本编辑工具。这类编辑器通常具有高效能和优化的内存管理机制,能够在不占用过多系统资源的情况下,快速加载和编辑大到几GB甚至更大的文件。对于程序员、...

    顺序表插入_数据结构_

    - 当数据量变化大,且插入和删除操作频繁时,动态数组或链表更为合适。 理解并掌握顺序表插入的概念和实现方法对于学习数据结构和算法至关重要,因为它们是许多高级数据结构和算法的基础,如栈、队列、哈希表等。...

    B树和B+树的插入、删除图文详解 - nullzx - 博客园1

    B树和B+树的设计保证了高效的查找、插入和删除,尤其适合大容量数据的存储系统。它们能够减少磁盘I/O操作,因为一次磁盘读取可以处理大量的数据,而且由于其高度较低,查找效率高。B+树的特性使其更适合数据库索引,...

    2路插入排序

    "2路插入排序"是一种对线性数据结构(如数组)进行排序的算法,它将原始数据分为已排序和未排序两部分。在这个过程中,一个辅助的循环数组被用来存储未排序的部分,而主数组则逐渐形成有序序列。具体操作包括比较、...

    数据结构 顺序表的插入与删除算法的C语言实现

    本文档旨在帮助读者理解并掌握顺序表的插入和删除操作的具体实现方法,并且能够根据实际需求灵活运用这些技术。 #### 二、基础知识 在深入探讨顺序表的插入和删除之前,我们需要了解一些基础知识: 1. **顺序表...

    数据结构一章线性表的的代码实现

    在实现插入操作时,需要先进行入口判断,确保当前线性表的长度未达到最大容量并且插入位置合法。如果满足条件,便可以执行元素的后移操作,即将所有位于插入位置之后的元素依次向后移动一位,然后在指定位置插入...

    嵌入式大容量数据存储解决方案

    嵌入式大容量数据存储解决方案是现代科技发展中的一个重要领域,尤其在32位嵌入式微处理器广泛应用的背景下,这种需求更为显著。传统的数据存储方法,如U盘、硬盘和SD/MMC卡,虽然提供了大容量存储的能力,但在体积...

    顺序表数据结构算法实现

    顺序表数据结构算法实现 顺序表是一种常见的线性表数据结构,通过顺序存储的方式来存储数据。下面是关于顺序表的知识点总结: 1. 顺序表的定义:顺序表是一种线性表数据结构,它是通过顺序存储的方式来存储数据的...

Global site tag (gtag.js) - Google Analytics