txt文件的读写以及相对日期的计算
题目描述
前几天字节面试时碰到了一道算法题。其中在数据预处理部分,需要从一个日志文件(txt文件)中把关键信息读进来,同时需要对其中的日期部分作进一步的特殊处理。
举例来讲,就是要把text.txt转换成dest.txt中的格式(三列分别代表日期、用户名、在线状态)。即要把日期映射成从0开始的整数(第一个日期为0),便于后续的算法实现。
//text.txt
2019-01-02 user1 0
2019-01-03 user1 1
2019-01-04 user1 1
2019-01-05 user1 1
// dest.txt
0 user1 0
1 user1 1
2 user1 1
3 user1 1
解决方法
当然现场写一个求相对日期的代码是比较困难的。幸好,java中的SimpleDateFormat工具类能将字符串格式化的日期转换成Date类,之后就能利用Date里的getTime()方法计算与起始日期的相对时间。
另外,txt文件的读和写可以利用BufferedReader和BufferedWriter来实现
Java源代码
为了演示代码看起来更简洁一点,代码中可能会抛出的各种异常统一用Exception来表示。
另外,代码中的文件路径是本人电脑上的全路径。
import java.io.*;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class FileReaderTest {
public static void show_text(String path) throws Exception {
//创建一个二维数组来保存text.txt文件中的内容
ArrayList<List<String>> arrs = new ArrayList<List<String>>();
//逐行读取text文件中的内容并保存到arrs中
File file = new File(path);
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
String s;
while ((s = bufferedReader.readLine()) != null) {
//System.out.println(s);
//将当前行的字符串按照 空格 分隔,并将得到的tmp数组转成list类型 存入arrs中
String[] tmp = s.split(" ");
arrs.add(Arrays.asList(tmp));
}
//关闭流
bufferedReader.close();
//开始计算相对日期
String start_time = arrs.get(0).get(0); //起始时间
//yyyy代表年份 MM(两个数字表示的月份)代表月份 dd(两个数字表示的几号)代表几号 横杠"-"就是text.txt中的"-"
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date d = df.parse(start_time);
//用来存放解析后的内容
ArrayList<String> content = new ArrayList<String>();
for (List<String> arr: arrs) {
String time = arr.get(0);
Date d1 = df.parse(time) ;
long diff = d1.getTime() - d.getTime(); //ms
int logIn = Integer.parseInt(arr.get(2));
// diff的单位是毫秒ms 为了得到天数 需要除以1000 再除以(24 * 3600),最终得到的就是相差的天数
//将三列的内容进行拼接,末尾的"\n"为了能在dest.txt文件中实现 换行 的效果
String line = String.valueOf(diff / (1000 * 24 * 3600)) + " " + arr.get(1) + " " + logIn + "\n";
content.add(line);
}
//将content中的内容逐行读入到dest.txt文件中
File file1 = new File("D:\\IdeaProjects\\design-pattern\\src\\main\\resources\\dest.txt");
BufferedWriter bfw = new BufferedWriter(new FileWriter(file1));
for (String line: content) {
bfw.write(line);
bfw.flush();
}
bfw.close();
}
public static void main(String[] args) throws Exception {
show_text("D:\\IdeaProjects\\design-pattern\\src\\main\\resources\\text.txt");
}
}