如何将CSV第一列yyyy/mm/dd日期转为yyyymmdd适配MySQL Int类型
解决CSV第一列日期格式转换为MySQL整数日期的问题
我懂你要做的事:把CSV第一列2018/01/25这种带斜杠的日期,转成无斜杠的20180125整数格式存入MySQL的int类型字段,同时完全保留其他列的内容不动。先给你修正原代码里的小坑,再实现日期转换的逻辑。
首先注意你原代码里的一个问题:while(reader.readLine()!= null)里已经调用了一次readLine(),循环里又调用一次,会跳过一行数据,得先把读取的行存到变量里再判断循环条件。
基础实现方案(假设日期格式都是标准yyyy/MM/dd)
直接去掉斜杠再转成整数,代码修改如下:
String readLine; // 修正读取逻辑,避免跳行 while ((readLine = reader.readLine()) != null) { String[] rawRow = readLine.split(","); // 只处理第一列,先确保数组存在第一列数据 if (rawRow.length > 0) { // 去掉日期里的所有斜杠,先trim避免前后空格干扰 String cleanDate = rawRow[0].trim().replaceAll("/", ""); // 转成int(如果MySQL字段是bigint,建议用Long.parseLong避免溢出) int mysqlDate = Integer.parseInt(cleanDate); // 替换第一列的值 rawRow[0] = String.valueOf(mysqlDate); } // 后续处理逻辑:比如把rawRow转成SQL插入语句,或者写入其他地方 // 示例:打印处理后的行 System.out.println(String.join(",", rawRow)); }
更严谨的实现(处理非标准日期格式)
如果CSV里的日期可能有单数字的月/日(比如2018/1/5),直接去掉斜杠会得到201815这种无效值,这时候用日期格式化工具解析再输出更稳妥:
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; // ... String readLine; // 定义输入输出的日期格式 SimpleDateFormat inputFormat = new SimpleDateFormat("yyyy/MM/dd"); SimpleDateFormat outputFormat = new SimpleDateFormat("yyyyMMdd"); while ((readLine = reader.readLine()) != null) { String[] rawRow = readLine.split(","); if (rawRow.length > 0) { String dateStr = rawRow[0].trim(); try { // 解析原日期字符串 Date date = inputFormat.parse(dateStr); // 格式化为无斜杠的8位数字串 String formattedDate = outputFormat.format(date); // 转成整数(用Long更安全,避免2038年后的日期溢出int) long mysqlDate = Long.parseLong(formattedDate); rawRow[0] = String.valueOf(mysqlDate); } catch (ParseException e) { // 处理格式错误的情况:比如跳过该行、记录错误日志 System.err.println("无效日期格式:" + dateStr); e.printStackTrace(); } } // 后续处理逻辑 }
额外注意事项
- 数据类型溢出:int类型的最大值是
2147483647,对应日期2038-01-19,如果你的日期包含2038年之后的记录,MySQL字段建议用bigint,代码里用Long类型处理更稳妥。 - CSV分割问题:如果其他列里包含逗号(比如某列是
"John, Doe"),用split(",")会把这列拆成两个元素,导致数据错乱。这种情况建议用专门的CSV解析库(比如OpenCSV)来读取,能正确处理带引号的字段。
内容的提问来源于stack exchange,提问作者Fortune Dludla
相关产品推荐
相关产品推荐

