題目描述:
筆試題: 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);
}
/**
* 讀入文件,格式化
/**
* @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
推薦
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com