自己常用得文件处理方式 java,乱码解决
程序员文章站
2022-04-30 13:38:11
...
文件处理不外乎三个步骤:读文件->处理文件->写文件(写入csv或者数据库),不需要入库的文件喜欢写入csv,然后转成excel,入库的文件就用jdbc操作,可以百度一下。
1.读文件
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("C:\\Users\\jiayq\\Documents\\测试.csv")), "gbk");
BufferedReader br = new BufferedReader(isr);
while((temp = br.readLine()) != null){
//处理文件,按行处理,用变量接收
//TO-DO
}
br.close();
2.处理文件,一般写着读文件得 TO-DO里
temp.split("\\s+");//按空格分割 tsv文件
temp.split(",");//按逗号分隔等 csv文件
3.写文件
处理完以后,读取得文件内容暂时在变量里面,我们需要把结果写入文件。
OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream(new File("E:\\公司项目\\sql.csv")), "gbk");
BufferedWriter bw = new BufferedWriter(osr);
bw.write("内容"); //按行写的
bw.close();
样例:
需求:写表设计文档,需要用excel,如下:
原材料是我们导出的数据结构:
无奈字段太多,所以写程序来处理:
我们需要的是:字段中文名,字段英文名,字段类型,注解。
发现源文件里面:每一行包含NULL的,就是字段所在行。
完整代码:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class File {
public static void main(String[] args) throws Exception{
String temp = "";
OutputStreamWriter osr = new OutputStreamWriter(new FileOutputStream(new File("E:\\公司项目\\sql.csv")), "gbk");
BufferedWriter bw = new BufferedWriter(osr);
InputStreamReader isr = new InputStreamReader(new FileInputStream(new File("E:\\公司项目\\sys_menu.sql")), "utf-8");
BufferedReader br = new BufferedReader(isr);
while((temp = br.readLine()) != null){
if(temp.contains("NULL")){
//array[0] 英文名 array[1]类型 array[length-1]中文名
String[] array = temp.split("\\s+");
System.out.println(array[1].replace("`", "") + "," + array[2] + "," + array[array.length-1].replace("'", ""));
bw.write(array[1].replace("`", "") + "," + array[2] + "," + array[array.length-1].replace("'", "") + "\r\n");
}
}
br.close();
bw.close();
}
}
处理结果:
如果出现乱码,可以将gbk和utf-8修改一下
============================例子所需数据==========================
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50640
Source Host : localhost:3306
Source Schema : telcom
Target Server Type : MySQL
Target Server Version : 50640
File Encoding : 65001
Date: 15/04/2020 09:00:21
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sys_menu
-- ----------------------------
DROP TABLE IF EXISTS `sys_menu`;
CREATE TABLE `sys_menu` (
`menu_id` bigint(20) NOT NULL COMMENT '主键id',
`code` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '菜单编号',
`pcode` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '菜单父编号',
`pcodes` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '当前菜单的所有父菜单编号',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '菜单名称',
`icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '菜单图标',
`url` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'url地址',
`sort` int(65) NULL DEFAULT NULL COMMENT '菜单排序号',
`levels` int(65) NULL DEFAULT NULL COMMENT '菜单层级',
`menu_flag` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '是否是菜单(字典)',
`description` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '备注',
`status` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT 'ENABLE' COMMENT '菜单状态(字典)',
`new_page_flag` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '是否打开新页面的标识(字典)',
`open_flag` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '是否打开(字典)',
`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
`create_user` bigint(20) NULL DEFAULT NULL COMMENT '创建人',
`update_user` bigint(20) NULL DEFAULT NULL COMMENT '修改人',
PRIMARY KEY (`menu_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin COMMENT = '菜单表' ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;