CVS文件导入

        项目中经常需要将数据批量导入数据库,避免用户繁重的手工输入工作。数据的批量导入,可以使用CVS格式,这种格式的文件可以通过Excel很方便进行输入,又不会因为格式问题导致导入错误。CVS文件的导入分以下两步:
        1. 上传CVS文件
        将CVS文件存贮到固定的位置,供解析时使用

        2. 解析CVS文件

        将CVS文件当作文本文件处理,逐行读取CVS文件,然后进行解析,并将解析结果根据实际业务进行处理,记录处理日志到日志文件。

import java.util.List;

/**
 * 逗号分割文件行数据加载接口
 * @version 1.0 2011-02-17
 * @author zhanzhengqiang
 */
public interface Loader {
    /**
     * 加载文件一行数据
     * @param recFiledList 数据列表
     * @throws Exception 加载数据异常
     */
    public void load(List recFiledList) throws Exception;
}

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

/**
 * 逗号分割文件数据加载类
 * @version 1.0
 * @author zhanzhengqiang
 */
public class CVSFileLoader {
    
    /**
     * 加载cvs文件路径
     */
    private File cvsFile;
    
    /**
     * 加载数据日志文件路径
     */
    private File logFile;
    
    /**
     * 默认构造函数
     */
    public CVSFileLoader() {
    }
    
    /**
     * 构造函数
     * @param cvsFile 加载cvs文件路径
     * @param logFile 加载数据日志文件路径
     * @param loader
     */
    public CVSFileLoader(File cvsFile, File logFile) {
        this.cvsFile = cvsFile;
        this.logFile = logFile;
        
        // 准备日志文件
        this.prepareLogFile();
    }
    
    /**
     * @return the cvsFile
     */
    public File getCvsFile() {
        return cvsFile;
    }

    /**
     * @param cvsFile the cvsFile to set
     */
    public void setcvsFile(File cvsFile) {
        this.cvsFile = cvsFile;
    }

    /**
     * @return the logFile
     */
    public File getLogFile() {
        return logFile;
    }

    /**
     * @param logFile the logFile to set
     */
    public void setLogFile(File logFile) {
        this.logFile = logFile;
        
        // 准备日志文件
        this.prepareLogFile();
    }

    /**
     * 加载CVS文件
     * @param loader 文件加载器
     * @throws Exception 加载异常
     */
    public void load(Loader loader) {
        this.writeLog("#导入数据开始#");
        try {
            // 读取CVS文件
            BufferedReader reader = new BufferedReader(new FileReader(this.cvsFile));
            // 逐行读取,并导入数据到数据库
            String line = null;
            // 行号
            int rownum = 1; 
            while ((line = reader.readLine()) != null) {
                try {
                    loader.load(parseLine(line));
                    this.writeLog("第" + rownum + "行:[" + line + "]导入成功");
                } catch(Exception e) {
                    this.writeLog("第" + rownum + "行:[" + line + "]导入出错:" + e.getMessage());
                }
                // 行号加一
                rownum ++;
            }            
        } catch (FileNotFoundException e) {
            this.writeLog("要导入的文件[" + cvsFile.getAbsolutePath() + "]找不到");
        } catch (IOException e) {
            this.writeLog("导入数据出错:" + e.getMessage());
        }
        this.writeLog("#导入数据结束#");
    }
    
    /**
     * 按逗号分割行
     * @param line 逗号分割文件行
     * @return 分割结果列表
     */
    private static List parseLine(String line) {
        // 解析字符串
        List tokenList = new ArrayList();
        StringBuffer token = new StringBuffer();
        // 是否在引号内
        boolean inQuotation = false;
        for (int i = 0; i < line.length(); i++) {
            char c = line.charAt(i);
            if (c == ',' && !inQuotation) {
                tokenList.add(token.toString());
                token.setLength(0);
            } else if (c == '"') {
                if (inQuotation) {
                    char d = line.charAt(i+1);
                    if (d == '"') {
                        token.append(c);
                        i ++;
                    } else {
                        inQuotation = !inQuotation;
                    }
                } else {
                    inQuotation = !inQuotation;
                }
            } else {
                token.append(c);
            }
        }
        tokenList.add(token.toString());
        
        // 返回解析结果
        return tokenList;
    }
    
    /**
     * 准备日志文件
     */
    private void prepareLogFile() {
        if (this.logFile == null) {
            return;
        }
        
        // 删除原日志文件
        if (this.logFile.isFile() && this.logFile.exists()) {
            this.logFile.delete();
        }
        // 创建日志目录
        File logDir = this.logFile.getParentFile();
        if (!logDir.exists()) {
            logDir.mkdirs();
        }
    }
    
    /**
     * 输出数据加载日志到日志文件
     * @param msg 日志信息
     */
    private void writeLog(String msg) {
        // 没有指定日志文件,则直接返回
        if (this.logFile == null) {
            return;
        }
        
        // 定义日志文件
        RandomAccessFile writeLogFile = null;
        try {
            writeLogFile = new RandomAccessFile(this.logFile, "rw");
            // 定位到文件末尾并换行
            if (writeLogFile.length() > 0) {
                writeLogFile.seek(logFile.length());
                writeLogFile.writeBytes(System.getProperty("line.separator"));
            }
            writeLogFile.write(msg.getBytes("GBK"));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (writeLogFile != null) {
                    writeLogFile.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

import java.io.File;
import java.io.IOException;
import java.util.List;

/** 测试类 */
public class ReadCSVFile {

    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        File cvsFile = new File("D:/TestFile.csv");
        File logFile = new File("D:/Load.log");
        
        CVSFileLoader loader = new CVSFileLoader(cvsFile, logFile);
        
        loader.load(new Loader(){
            public void load(List recFieldList) throws Exception{
                for (int i = 0; i < recFieldList.size(); i++) {
                    System.out.println("F[" + i + "]=" + recFieldList.get(i));
                }
            }
        });
    }
}

        以上代码只是示例,没有涉及实际业务,实际项目中需要根据实际业务对数据进行处理。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL 导入 CSV文件的步骤如下: 1. 首先,确保你已经下载并安装了 MySQL 数据库,并且可以访问到 MySQL 命令行客户端(或者使用图形界面工具)。 2. 创建一个目标数据库(如果还没有),可以使用如下命令: ``` CREATE DATABASE dbname; ``` 这里 `dbname` 是你想要创建的数据库名称。 3. 进入到 MySQL 命令行客户端,并连接到目标数据库: ``` USE dbname; ``` 这里 `dbname` 是你之前创建的数据库名称。 4. 创建一个用来导入数据的表,可以根据 CSV 文件的列名和数据类型来创建表结构,例如: ``` CREATE TABLE tablename ( column1 datatype, column2 datatype, column3 datatype, ... ); ``` 这里 `tablename` 是你想要创建的表名,`column1`, `column2`, `column3` 是列名,`datatype` 是对应的数据类型。 5. 使用 `LOAD DATA INFILE` 命令导入 CSV 文件,例如: ``` LOAD DATA INFILE 'path/to/filename.csv' INTO TABLE tablename FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES; ``` 这里 `path/to/filename.csv` 是你的 CSV 文件路径,`tablename` 是你之前创建的表名,`FIELDS TERMINATED BY ','` 指定了 CSV 文件的字段分隔符,默认是逗号分隔,`LINES TERMINATED BY '\n'` 指定了换行符,`IGNORE 1 LINES` 表示跳过 CSV 文件的第一行(即标题行)。 6. 导入完成后,可以通过查询语句验证数据是否成功导入,例如: ``` SELECT * FROM tablename; ``` 这里 `tablename` 是你之前创建的表名。 以上就是使用 MySQL 导入 CSV文件的步骤。注意,如果你的 CSV 文件非常大,可能会遇到导入时间过长或内存不足等问题,可以考虑使用数据库工具或专业的 ETL 工具来导入和处理大文件
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值