- 浏览: 108908 次
- 性别:
- 来自: 北京
最新评论
-
oaklet:
最新改进型
# coding:gbk
import sys
...
密码生成小工具 -
西斧头帮老大-_-:
楼主,那个我写了个例子
Map<String,Strin ...
EHCache简单使用 -
hopana:
发一下源代码吧,想学习一下
EHCache简单使用 -
menghuannvxia:
谢谢,学习了
EHCache简单使用 -
wtaisi:
非常好。。。。
EHCache简单使用
环境如下:
python-2.5.2
工作中经常遇到类似csv格式的文件文件,
为了处理起来方便,一般要导入到数据库中
MYSQL导入工具代码:
使用方法如下:
CSVloader -h
CSVloader -f bsc.csv bts.csv
CSVloader -d dir1 dir2
CSVloader -f bsc.csv bts.csv -s ,
CSVloader -d dir1 dir2 -s ,
CSVloader -s , -f bsc.csv bts.csv
CSVloader -s , -d dir1 dir2
Options include:
-h [help] - 打印帮助
-s [separtor] - 使用的分割符,默认 tab
-f [fileName] - 文件名,可以指定多个
-d [dirName] - 文件夹,可以指定多个
注意:文件必须是 UTF-8 编码
顺便写了个bat文件:
CSVloader.bat
(WinXP SP2,MySQL 5.0下使用通过,MySQL数据库使用UTF8编码,csv文件使用UTF8编码)
测试文本:A_OBJECT.txt
Oracle导入工具:
(WinXP SP2,Oracle 11下使用通过,Oracle数据库使用GBK编码,csv文件使用GBK编码)
注意一下,小工具拿到文件后,
会以文件名作为表名,开始造表(create),
字段全部为字符串,各个字段长度会根据
第一批读入的数据进行计算(第一批读1M,可以调,防大文件用的),
还要注意一下
MySQL版本与Oracle版本有点区别,
MySQL版本有自动删除表功能,先试着删除一遍,才会建表,导入数据;
Oracle版本没有加删除表功能,只有建表导入数据过程。
(MySQL一般只在自己本本上使用,所以导入,改改文件再导入方便,无需去手动删除表,
Oracle一般会在服务器上导数据用,怕删掉不该删除的东西,所以未加这个功能)
再有MySQL版用UTF8编码,Oracle版用的GBK编码,这个跟数据库的设置有关
UTF8编码与GBK编码转换,可参考使用文本学习笔记3的批量转换工具
当然,文件不多也可以用文本编辑器手动另存转换。
贾
卢
惨
御
雏
皿
陨
褶
苷
嫌
盯
铡
python-2.5.2
工作中经常遇到类似csv格式的文件文件,
为了处理起来方便,一般要导入到数据库中
MYSQL导入工具代码:
# coding:UTF-8 import os import sys import time import MySQLdb perread = 1048576 # 1M original = 32 size_list = [] for i in range(125): size_list.append(original) original = original + 32 def getSize(aName, aSize): for i in size_list: if aSize<i: return i raise ValueError("字段太长 '%s' %s"%(aName, aSize)) def loadCSV(fileName, separtor=" "): print "loadCSV", fileName, "..." tf = file(fileName, "r") connMys = MySQLdb.connect(host="127.0.0.1", user="root", passwd="pass", db="test", charset="UTF8") begin = time.time() mark = 0 count = 0 currLines = tf.readlines(perread) count = count + len(currLines) - 1 currTable = [i.rstrip().split(separtor) for i in currLines if len(i.rstrip())>0] columnName = currTable[0] for i in columnName: if not i: raise ValueError("字段名不能为空!") columnCount = len(columnName) currTable = fillSpace(currTable, columnCount) currTable = distinctColumn(currTable) aName = os.path.split(fileName)[1].split(".")[0] dropSQL, createSQL, insertSQL = buildCreate(aName, currTable) cursorMys = connMys.cursor() print dropSQL, ";" cursorMys.execute(dropSQL) print createSQL, ";" cursorMys.execute(createSQL) connMys.commit() print insertSQL, ";" for i in currTable[1:]: cursorMys.execute(insertSQL, i) connMys.commit() print "insert", count, "lines." while tf.tell() > mark: mark = tf.tell() currLines = tf.readlines(perread) if not tf.tell() > mark: break count = count + len(currLines) currTable = [i.rstrip().split(separtor) for i in currLines if len(i.rstrip())>0] currTable = fillSpace(currTable, columnCount) for i in currTable: cursorMys.execute(insertSQL, i) connMys.commit() print "insert", count, "lines." end = time.time() print "Count:%s Time:%s"%(count, end - begin) cursorMys.close() connMys.close() tf.close() def fillSpace(aTable, colCount): for ii, iv in enumerate(aTable): while len(iv) < colCount: iv.append("") if len(iv) != colCount: raise ValueError("字段不够多!" + str(iv)) return aTable def distinctColumn(aTable): columnNames = aTable[0] ucolumnNames = set(columnNames) if len(columnNames)==len(ucolumnNames): return aTable tcinclude = [] tcexclude = [] for i, v in enumerate(columnNames): if v in tcinclude: print "字段竟然重复", v tcexclude.append(i) else: tcinclude.append(v) result = [] for i in aTable: result.append([v for j, v in enumerate(i) if j not in tcexclude]) return result def buildCreate(aName, aTable): columnNames = aTable[0] columnSizes = [getSize(k, len(v)) for k, v in zip(aTable[0], aTable[1])] for i in aTable[2:]: for j, v in enumerate(i): if not len(v)<columnSizes[j]: columnSizes[j] = getSize(columnNames[j], len(v)) dropSQL = "DROP TABLE IF EXISTS " + aName createSQL = ["CREATE TABLE IF NOT EXISTS " + aName] createSQL.append("(") for k, v in zip(columnNames, columnSizes): currLines = " %s VARCHAR(%s),"%(k, v) createSQL.append(currLines) createSQL[-1] = " %s VARCHAR(%s)"%(k, v) createSQL.append(")") k = ", ".join(columnNames) v = ", ".join(["%s" for i in range(len(columnNames))]) insertSQL = "INSERT INTO %s (%s) VALUES (%s)"%(aName, k, v) return (dropSQL, "\n".join(createSQL), insertSQL) def usage(): print "CSVloader -h" print "CSVloader -f bsc.csv bts.csv" print "CSVloader -d dir1 dir2" print "CSVloader -f bsc.csv bts.csv -s ," print "CSVloader -d dir1 dir2 -s ," print "CSVloader -s , -f bsc.csv bts.csv" print "CSVloader -s , -d dir1 dir2" print " Options include:" print " -h [help] - 打印帮助" print " -s [separtor] - 使用的分割符,默认 tab" print " -f [fileName] - 文件名,可以指定多个" print " -d [dirName] - 文件夹,可以指定多个" print print " 注意:文件必须是 UTF-8 编码" if __name__ == "__main__": if "-h" in sys.argv: usage() elif "-d" in sys.argv: separtor = " " idxf = sys.argv.index("-d") if "-s" in sys.argv: idxs = sys.argv.index("-s") separtor = sys.argv[idxs+1] if idxs>idxf: for i in sys.argv[idxf+1:idxs]: for j in os.listdir(i): loadCSV(os.path.join(i, j), separtor) else: for i in sys.argv[idxf+1:]: for j in os.listdir(i): loadCSV(os.path.join(i, j), separtor) else: for i in sys.argv[idxf+1:]: for j in os.listdir(i): loadCSV(os.path.join(i, j), separtor) elif "-f" in sys.argv: separtor = " " idxf = sys.argv.index("-f") if "-s" in sys.argv: idxs = sys.argv.index("-s") separtor = sys.argv[idxs+1] if idxs>idxf: for i in sys.argv[idxf+1:idxs]: loadCSV(i, separtor) else: for i in sys.argv[idxf+1:]: loadCSV(i, separtor) else: for i in sys.argv[idxf+1:]: loadCSV(i, separtor) else: usage()
使用方法如下:
CSVloader -h
CSVloader -f bsc.csv bts.csv
CSVloader -d dir1 dir2
CSVloader -f bsc.csv bts.csv -s ,
CSVloader -d dir1 dir2 -s ,
CSVloader -s , -f bsc.csv bts.csv
CSVloader -s , -d dir1 dir2
Options include:
-h [help] - 打印帮助
-s [separtor] - 使用的分割符,默认 tab
-f [fileName] - 文件名,可以指定多个
-d [dirName] - 文件夹,可以指定多个
注意:文件必须是 UTF-8 编码
顺便写了个bat文件:
CSVloader.bat
@echo off python CSVloader.py %*
(WinXP SP2,MySQL 5.0下使用通过,MySQL数据库使用UTF8编码,csv文件使用UTF8编码)
测试文本:A_OBJECT.txt
oid,city,type,pid 7,邢台市,103,7 8,廊坊市,103,8 1,沧州市,103,1 3,高邑县,104,4 4,河间市,104,1 2,赵县,104,4
Oracle导入工具:
# coding:GBK import os import sys import time import cx_Oracle perread = 1048576 # 1M # original = 64 # size_list = [] # while original<4000: # size_list.append(original) # original = original*2 original = 32 size_list = [] for i in range(125): size_list.append(original) original = original + 32 def getSize(aName, aSize): for i in size_list: if aSize<i: return i raise ValueError("字段太长 '%s' %s"%(aName, aSize)) def loadCSV(fileName, separtor=" "): print "loadCSV", fileName, "..." tf = file(fileName, "r") connOra = cx_Oracle.connect("user", "pass", "192.168.1.110:1521/testdb") begin = time.time() mark = 0 count = 0 currLines = tf.readlines(perread) count = count + len(currLines) - 1 currTable = [i.rstrip().split(separtor) for i in currLines if len(i.rstrip())>0] columnName = currTable[0] for i in columnName: if not i: raise ValueError("字段名不能为空!") columnCount = len(columnName) currTable = fillSpace(currTable, columnCount) currTable = distinctColumn(currTable) aName = os.path.split(fileName)[1].split(".")[0] createSQL, insertSQL = buildCreate(aName, currTable) cursorOra = connOra.cursor() print createSQL, ";" cursorOra.execute(createSQL) connOra.commit() print insertSQL, ";" cursorOra.prepare(insertSQL) cursorOra.executemany(None, currTable[1:]) connOra.commit() print "insert", count, "lines." while tf.tell() > mark: mark = tf.tell() currLines = tf.readlines(perread) if not tf.tell() > mark: break count = count + len(currLines) currTable = [i.rstrip().split(separtor) for i in currLines if len(i.rstrip())>0] currTable = fillSpace(currTable, columnCount) cursorOra.executemany(None, currTable) connOra.commit() print "insert", count, "lines." end = time.time() print "Count:%s Time:%s"%(count, end - begin) cursorOra.close() connOra.close() tf.close() def fillSpace(aTable, colCount): for ii, iv in enumerate(aTable): while len(iv) < colCount: iv.append("") if len(iv) != colCount: raise ValueError("字段不够多!" + str(iv)) return aTable def distinctColumn(aTable): columnNames = aTable[0] ucolumnNames = set(columnNames) if len(columnNames)==len(ucolumnNames): return aTable tcinclude = [] tcexclude = [] for i, v in enumerate(columnNames): if v in tcinclude: print "字段竟然重复", v tcexclude.append(i) else: tcinclude.append(v) result = [] for i in aTable: result.append([v for j, v in enumerate(i) if j not in tcexclude]) return result def buildCreate(aName, aTable): columnNames = aTable[0] columnSizes = [getSize(k, len(v)) for k, v in zip(aTable[0], aTable[1])] for i in aTable[2:]: for j, v in enumerate(i): if not len(v)<columnSizes[j]: columnSizes[j] = getSize(columnNames[j], len(v)) createSQL = ["CREATE TABLE " + aName] createSQL.append("(") for k, v in zip(columnNames, columnSizes): currLines = " %s VARCHAR2(%s),"%(k, v) createSQL.append(currLines) createSQL[-1] = " %s VARCHAR2(%s)"%(k, v) createSQL.append(")") k = ", ".join(columnNames) v = ", ".join([":%s"%(i+1) for i in range(len(columnNames))]) insertSQL = "INSERT INTO %s (%s) VALUES (%s)"%(aName, k, v) return ("\n".join(createSQL), insertSQL) def usage(): print "CSVloader -h" print "CSVloader -f bsc.csv bts.csv" print "CSVloader -d dir1 dir2" print "CSVloader -f bsc.csv bts.csv -s ," print "CSVloader -d dir1 dir2 -s ," print "CSVloader -s , -f bsc.csv bts.csv" print "CSVloader -s , -d dir1 dir2" print " Options include:" print " -h [help] - 打印帮助" print " -s [separtor] - 使用的分割符,默认 tab" print " -f [fileName] - 文件名,可以指定多个" print " -d [dirName] - 文件夹,可以指定多个" print print " 注意:文件必须是 GBK 编码" if __name__ == "__main__": if "-h" in sys.argv: usage() elif "-d" in sys.argv: separtor = " " idxf = sys.argv.index("-d") if "-s" in sys.argv: idxs = sys.argv.index("-s") separtor = sys.argv[idxs+1] if idxs>idxf: for i in sys.argv[idxf+1:idxs]: for j in os.listdir(i): loadCSV(os.path.join(i, j), separtor) else: for i in sys.argv[idxf+1:]: for j in os.listdir(i): loadCSV(os.path.join(i, j), separtor) else: for i in sys.argv[idxf+1:]: for j in os.listdir(i): loadCSV(os.path.join(i, j), separtor) elif "-f" in sys.argv: separtor = " " idxf = sys.argv.index("-f") if "-s" in sys.argv: idxs = sys.argv.index("-s") separtor = sys.argv[idxs+1] if idxs>idxf: for i in sys.argv[idxf+1:idxs]: loadCSV(i, separtor) else: for i in sys.argv[idxf+1:]: loadCSV(i, separtor) else: for i in sys.argv[idxf+1:]: loadCSV(i, separtor) else: usage()
(WinXP SP2,Oracle 11下使用通过,Oracle数据库使用GBK编码,csv文件使用GBK编码)
注意一下,小工具拿到文件后,
会以文件名作为表名,开始造表(create),
字段全部为字符串,各个字段长度会根据
第一批读入的数据进行计算(第一批读1M,可以调,防大文件用的),
还要注意一下
MySQL版本与Oracle版本有点区别,
MySQL版本有自动删除表功能,先试着删除一遍,才会建表,导入数据;
Oracle版本没有加删除表功能,只有建表导入数据过程。
(MySQL一般只在自己本本上使用,所以导入,改改文件再导入方便,无需去手动删除表,
Oracle一般会在服务器上导数据用,怕删掉不该删除的东西,所以未加这个功能)
再有MySQL版用UTF8编码,Oracle版用的GBK编码,这个跟数据库的设置有关
UTF8编码与GBK编码转换,可参考使用文本学习笔记3的批量转换工具
当然,文件不多也可以用文本编辑器手动另存转换。
贾
卢
惨
御
雏
皿
陨
褶
苷
嫌
盯
铡
发表评论
-
密码生成小工具
2011-12-27 09:57 2273CSDN数据库.zip 天涯数据库.zip 金山毒霸.zip ... -
文本处理学习笔记4
2010-09-07 17:18 1176环境情况如下: python-2.5.2 Python在文 ... -
文本处理学习笔记3
2010-06-17 13:48 1644环境情况如下: python-2.5.2 pytho ... -
文本处理学习笔记2
2010-01-29 16:04 1454环境情况如下: python-2.5.2 Python在文 ... -
Oracle入库速度测试(Python版)
2008-08-26 19:09 3002测试环境: Intel Xeon 2.4G四核心 2. ... -
文本处理学习笔记1
2008-02-26 12:24 1460环境情况如下: python-2.5.2 ibatis-2.3 ...
相关推荐
【标题】"h5前端学习笔记"所涵盖的知识点主要集中在HTML5技术及其在前端开发中的应用。HTML5是超文本标记语言的最新版本,它引入了许多新的元素、API和特性,极大地增强了网页的交互性、可访问性和可用性。 【描述...
j2me学习笔记【5】——抛出异常处理的小例子 j2me学习笔记【6】——获取日期时间 j2me学习笔记【7】——复选框的应用 j2me学习笔记【8】——TextField的使用实例 j2me学习笔记【9】——List中复选框的使用实例 j2me...
本压缩包包含的“C语言学习笔记”是一份详尽的C语言学习资料,旨在帮助读者深入理解和掌握C语言的基本概念、语法结构以及实际应用技巧。 一、C语言基础 C语言的基础包括变量、数据类型、运算符、流程控制等。变量...
这份"Linux学习笔记(强悍总结值得一看)"是Linux初学者的宝贵资源,也适合有经验的用户作为参考手册。以下是对笔记内容的详细概述: 1. **Linux常用命令**: Linux命令行是其强大的工具,掌握常用命令是Linux学习...
【Java学习笔记Markdown版】是针对Java初学者和进阶者的一份详尽教程,以Markdown格式编写,便于阅读和整理。Markdown是一种轻量级的标记语言,它允许用户使用易读易写的纯文本格式编写文档,然后转换成结构化的HTML...
Perl是一种强大的脚本编程语言,尤其适合文本处理和系统管理任务。在个人的学习过程中,掌握其基本语法和特性是至关重要的。以下是对标题和描述中提及的一些关键知识点的详细解释: 1. **操作符**: Perl中的`x`操作...
### Python学习笔记知识点详解 #### 一、Python简介与特性 **标题与描述解析:** "Python学习笔记.pdf" 的标题直接指出了文档的主题——Python的学习资料,而描述的重复表明该文档的主要内容即为Python的学习笔记...
这篇笔记将探讨如何使用HSQL处理文本数据库,结合标签"源码"和"工具",我们将深入理解HSQL的功能和应用。 首先,让我们了解HSQL的基本概念。HSQLDB是一个完全Java编写的数据库,这意味着它可以在任何支持Java的平台...
本学习笔记涵盖了 web 前端开发的基础知识,包括 HTML 的基本结构、文档类型声明、常见的文本和列表标签、分区标签以及图片标签的使用方法。对于初学者而言,这些内容是构建网页的基础,而掌握这些基础知识是进一步...
《JSP & Servlet学习笔记(第2版)》涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。 《JSP & Servlet学习笔记(第2版)》以“微博”项目贯穿全书,将JSP & Servlet技术应用...
4. **字符串操作**:Python对字符串处理提供了丰富的函数,包括字符串连接、查找、替换、格式化输出等,了解正则表达式可以进行更复杂的文本处理。 5. **控制流**:通过if-elif-else语句进行条件判断,for和while...
【Java学习笔记模版】 Java实习工程师在学习过程中,会涉及到许多关键知识点,尤其是在企业级开发的场景下。从给出的四天学习笔记来看,实习生正在逐步掌握Java Web开发的基础和核心技能。以下是对这些知识点的详细...
这份"Python学习笔记"涵盖了从环境搭建到基础语法,再到数据类型和控制结构等关键知识点,旨在为初学者提供全面的学习指导。 首先,1.1章节介绍了Python的基础,包括Python的起源和历史。Python是由Guido van ...
文档的更新历史表明,该学习笔记不断地被更新和完善,以确保其内容的准确性和时效性。作者黄海广对笔记进行了多次修改和补充,以修正错误并增加新的内容,比如OCTAVE操作内容、数学基础和公式推导等。这体现了作者对...
【Python学习笔记-王纯业】是一份专为Python初学者设计的教程,由王纯业编撰。这个教程深入浅出地介绍了Python编程的基础知识,帮助初学者快速上手。下面将详细阐述该教程中可能包含的重要知识点,以及Python入门者...
本书还涵盖了文本处理、图片验证、自动登录、验证过滤器、压缩处理、JSTL应用与操作等各种实用范例。 本书在讲解的过程中,以“微博”项目贯穿全书,随着每一章的讲述都在适当的时候将JSP & Servlet技术应用于...
在"java gui学习笔记"中,我们主要关注两个核心概念:组件(Components)和事件处理(Event Handling)。 首先,GUI界面设计通常涉及各种组件,如按钮(Buttons)、菜单项(MenuItems)、文本字段(TextFields)等...
以下是对Oracle学习笔记中提到的一些关键知识点的详细解释: 1. **SQL执行顺序**: SQL语句的执行顺序是:`FROM` -> `WHERE` -> `SELECT` -> `GROUP BY` -> `HAVING` -> `ORDER BY`。首先从`FROM`子句开始,确定...