视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
照片上的水印文字怎么去除 手机qq怎么自动发消息 wps表格怎么制作条形码 抖音精选联盟如何开通 我想建个微信群怎么建 qq群投票怎么撤销 抖音精选联盟平台怎么开通 怎么使用wps制作条形码 土豆有黑点 新旧手机怎么互传照片 商家怎么加入抖音精选联盟 2019WPS怎么制作条形码 word里怎么添加勾选框 w10电脑屏锁怎么设置密码 抖音精选联盟怎么加入 wps中怎么制作条形码 容声冰箱不结冰是什么原因 金枪鱼怎么吃好吃 wps表格中条形码怎么制作 惠普打印机身份证怎么复印正反面在一张纸上 怎么加入抖音精选联盟 怎么能辨别黄金的真假 条形码怎么制作wps w7计算机的蓝牙在哪里 商家怎样加入抖音精选联盟 手机淘宝怎样取消隐藏评价 word里怎么删除分节符下一页 wps表格条形码怎么制作 怎么做的绿豆汤才好吃 中国的光棍节是哪一天 ps怎么把图层叠加在一起 wps条形码怎么制作 家庭版绿豆汤怎么做 海尔冰箱一般工作多久停机 怎么在wps里制作条形码 联想打印机处于错误状态是怎么回事 怎么做传统绿豆汤 迁移过来的微信聊天记录怎么查看 怎么用wps制作条形码 怎么关掉keep自动续费
北京车和家java开发工程师面试题总结
2020-11-27 21:50:24 责编:小采
文档
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

题目描述:

笔试题: CSV 文件处理

给定一个 CSV 文件,其内容的展现规则如下:

?

- 每一行数据包含多个字段,字段间以 [,] 分割。

- 如果字段值不含有 [,] 和 ["] ,直接解析输出。

- 如果字段值内部含有逗号 [,],在在字段值两边加上双引号 ["] 将字段值括起来。

- 如果字段值内部含有双引号 ["],则字段值两边加上双引号 ["] 括起来,同时,将字段值内的一个双引号 ["] 替换为两个双引号 [""],例如: [下棋,"飞"] 在 CSV 文件中被表现为 ["下棋,""飞"""]。

处理要求:

读入文件 cvs.txt,根据上述 csv 文件的规则进行解析,重新格式化字段生成输出文件 output.txt

第一列转为整形(int)

第二列为字符串型

第三列为字符串型

第四列转为浮点数(float)

第五列转为日期类型(DateTime)

?

输出文件的字段以制表符 [TAB] 来分割字段,

字符串字段输出时用单引号[']括起来

日期字段显示成 YYYY/MM/DD 的格式

?

说明:

1、可以假设字段值只包含单行数据,即字段值本身不含有 [回车换行]

2、不能对文件 csv.txt 作任何修改

?

编程要求:

?

使用任何你熟悉的编程语言编写,时间为 1.5 小时。

题目意思:

这个题目意思描述的不是很清楚,就是给你一个格式化后的csv文件,重新还原到刚开始的文件

还有就是,字段值中同时有 [,] 和?["] 只会在最外层加一次["]

思路:

1. 主要难点在于第二列和第三列如何区分开,因为第二列和第三列都是字符串

2. 区分的思路为,遍历所有[,],如果[,]左边["]的个数和右边["]的个数都为偶数,则这个[,]为分隔第二个字符串和
第三个字符串的分界点

3. 找到分界点后,格式化输出即可

代码:

package com.st.solution.main;

import com.st.solution.util.DateTimeUtil;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author: lilimin
 * @Date: 2019/6/28 20:09
 */
public class Solution {

 public static void main(String[] args) {

 String readFileName = "src/main/resources/csv.txt";
 String writeFileName = "src/main/resources/output.txt";
 readAndWriteFile(readFileName, writeFileName);
 }

 /**
 * 读入文件,格式化
输出 * @param readFileName * @param writeFileName */ public static void readAndWriteFile(String readFileName, String writeFileName) { BufferedReader reader = null; BufferedWriter writer = null; try { reader = new BufferedReader(new FileReader(new File(readFileName))); writer = new BufferedWriter(new FileWriter(new File(writeFileName))); String line = null; while ((line = reader.readLine()) != null) { String formatText = formatText(line); writer.write(formatText); } } catch (Exception e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if (writer != null) { try { writer.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 格式化每一行数据的输出 * @param text * @return */ public static String formatText(String text) { // 如果字段值不含有 [,] 和 ["] ,直接解析输出。 if (!text.contains(",") && !text.contains("\"")) { return text; } String[] splitTextArray = text.split(","); int arrayLength = splitTextArray.length; List<String> tempList = new ArrayList<String>(); tempList.add(splitTextArray[0]); // 如果split后的数组长度为4,说明字符中间没有, if (arrayLength == 4) { tempList.add(formatStrText(splitTextArray[1])); tempList.add(formatStrText(splitTextArray[2])); } else { // 第2列 或者 第3列 字符中间有, // 获取第二列和第三列合起来的字符串 StringBuilder middleText = new StringBuilder(); for (int i = 1; i <arrayLength - 3 ; i++) { middleText.append(splitTextArray[i]).append(","); } middleText.append(splitTextArray[arrayLength- 3]); // 获取第二列和第三列格式化后的字符串 List<String> middleTextList = formatMiddleText(middleText.toString()); tempList.addAll(middleTextList); } tempList.add(splitTextArray[arrayLength - 2]); tempList.add(DateTimeUtil.transferDateformat(splitTextArray[arrayLength - 1])); return String.join(" ", tempList) + "\n"; } /** * 格式化string类型的字符串 * @param text * @return */ public static String formatStrText(String text) { if (text.startsWith("\"") && text.endsWith("\"")) { text = text.substring(1, text.length() - 1); } text = text.replaceAll("\"\"", "\""); return "'" + text + "'"; } /** * 找出第二列和第三列的分界点[,],并且格式化第二列和第三列 * 原则如下,遍历所有[,],如果某个[,] 左边的["]个数和右边的["]个数都为偶数 * 则一定是第二三列的分界点 * @param text * @return */ public static List<String> formatMiddleText(String text) { List<String> list = new ArrayList<String>(); String tempText = text; int index = -1; while ((index = tempText.indexOf(",", index + 1)) != -1) { int leftSum = 0; int rightSum = 0; for (int i = 0; i < index; i++) { if (text.charAt(i) == '"') { leftSum++; } } for (int i = index + 1; i < text.length(); i++) { if (text.charAt(i) == '"') { rightSum++; } } if ((leftSum & 1) == 0 && (rightSum & 1) == 0) { break; } } list.add(formatStrText(text.substring(0, index))); list.add(formatStrText(text.substring(index + 1))); return list; } }
/**
 * @Author: lilimin
 * @Date: 2019/6/28 20:09
 */
public class DateTimeUtil {


 /**
 * 将 yyyy-MM-dd 格式的日期字符串转为 yyyy/MM/dd 格式的日期字符串
 * @param timestr
 * @return
 */
 public static String transferDateformat(String timestr) {
 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
 SimpleDateFormat sdf2 = new SimpleDateFormat("YYYY/MM/DD");
 Date parse = null;
 try {
  parse = sdf1.parse(timestr);
 } catch (ParseException e) {
  e.printStackTrace();
 }
 return sdf2.format(parse);
 }
}

我代码最后的output.txt的内容为

1 'Jane' '下"棋,"飞"' 56.2 1976/08/236
2 'Kate' '购物' 49.6 1980/01/25
3 'Jerry' '羽毛球,爬山' 55.6 1980/05/147

作为一个完整的工程,单测必不可少


/**
 * @Author: lilimin
 * @Date: 2019/6/29 16:14
 */
public class SolutionTest {

 @Test
 public void readAndWriteFile() {
 String readFileName = "src/main/resources/test1csv.txt";
 String writeFileName = "src/main/resources/test1output.txt";

 Solution.readAndWriteFile(readFileName, writeFileName);

 readFileName = "src/main/resources/test2csv.txt";
 writeFileName = "src/main/resources/test2output.txt";

 Solution.readAndWriteFile(readFileName, writeFileName);
 }

 @Test
 public void formatStrText() {
 String text = Solution.formatStrText("\"\"\"text\"\"\"");
 assertEquals("'\"text\"'", text);
 }

 @Test
 public void formatMiddleText() {
 List<String> textList = Solution.formatMiddleText("str1,str2");
 assertEquals("'str1'", textList.get(0));
 assertEquals("'str2'", textList.get(1));

 textList = Solution.formatMiddleText("\"str1\",\"str2\"");
 assertEquals("'str1'", textList.get(0));
 assertEquals("'str2'", textList.get(1));

 textList = Solution.formatMiddleText("\"\"\"str1\",\"str2\"");
 assertEquals("'\"str1'", textList.get(0));
 assertEquals("'str2'", textList.get(1));
 }
}

单测的输入和输出如下

test1.csv

2,",Kate",购物,49.6,1979-12-56
3,Jerry,"羽毛球,爬山",55.6,1980-5-26

test1output.txt

2 ',Kate' '购物' 49.6 1980/01/25
3 'Jerry' '羽毛球,爬山' 55.6 1980/05/147

test2.csv

1,Jane,"下""棋,""飞""",56.2,1976-8-23
2,"Kate,Kate","购物,购物",49.6,1979-12-56
3,Jerry,"羽毛球,爬山",55.6,1980-5-26

test2output.txt

1 'Jane' '下"棋,"飞"' 56.2 1976/08/236
2 'Kate,Kate' '购物,购物' 49.6 1980/01/25
3 'Jerry' '羽毛球,爬山' 55.6 1980/05/147

推荐

下载本文
显示全文
专题苹果笔记本截屏的快捷键是什么苹果笔记本截屏的快捷键是什么专题iphone照片永久删除怎么恢复iphone照片永久删除怎么恢复专题废手机怎样提炼黄金废手机怎样提炼黄金专题手机卡没信号怎么回事手机卡没信号怎么回事专题电脑启动不了反复启动电脑启动不了反复启动专题iphone视频怎么转音频iphone视频怎么转音频专题qq个人文件夹中的文件被占用暂时无法登录qq个人文件夹中的文件被占用暂时无法登录专题word表格每页固定表头word表格每页固定表头专题注册微信怎么跳过辅助注册微信怎么跳过辅助专题微信收藏占用手机存储空间吗微信收藏占用手机存储空间吗专题无手机号怎么注册qq无手机号怎么注册qq专题橡胶刺鼻气味如何去除橡胶刺鼻气味如何去除专题家里的蟑螂是怎么来的家里的蟑螂是怎么来的专题怎么赶走黄鼠狼妙招怎么赶走黄鼠狼妙招专题蟑螂怎么来的蟑螂怎么来的专题相互宝怎么取消相互宝怎么取消专题相互保怎么退出相互保怎么退出专题雪是怎么形成的雪是怎么形成的专题蟑螂是怎么进入家里的蟑螂是怎么进入家里的专题洁厕灵蓝泡泡怎么用洁厕灵蓝泡泡怎么用专题如何判断面粉变质如何判断面粉变质专题房间里有老鼠用什么方法可以解决房间里有老鼠用什么方法可以解决专题家庭野生菌冷冻保存技巧家庭野生菌冷冻保存技巧专题竹荪煮多长时间熟竹荪煮多长时间熟专题老鼠胶怎么洗掉老鼠胶怎么洗掉专题怎么杀蟑螂怎么杀蟑螂专题航班号怎么看航班号怎么看专题花雕酒怎么喝花雕酒怎么喝专题板栗壳怎么好剥板栗壳怎么好剥专题烤红薯没有锡纸怎么办烤红薯没有锡纸怎么办专题运维架构师面试题专题运维开发 面试题专题web工程师面试题专题web高级工程师面试题专题web开发工程师面试题专题文档开发工程师面试题专题c语言开发工程师面试题专题前端开发工程师 面试题专题开发工程师面试题专题c++开发工程师常用面试题专题前端开发工程师面试题目专题c++开发工程师面试题专题后端开发工程师面试题专题开发工程师面试问题专题大数据开发工程师 面试题专题数据开发工程师面试题目专题高级开发工程师面试题专题etl开发工程师面试题及答案专题.net高级开发工程师面试题专题etl数据开发工程师面试题专题