任务:文件格式转换。
---------------------
在本题号对应的文件夹中,有一个示例输入文件:“in.txt”(编码方式为gb2312)
其中的内容为参加某次大赛学校及其参赛学生的得分等信息
其基本格式如下:
aaa工程技术学院:010-21345673:na005:xijing
84:java:13553001115:张小林
67:c:13725330616:李自云
25:java:13312349988:肖为
bbb理工大学:094-32421233:km008:lushan
81:c:18997111533:徐路
92:java::曹丽
ccc传媒大学:041-44441233:mt009:linhai
88:c++:15900010002:夏侯艺人
第一行数据是院校信息,信息项以冒号(:)分开。
院校信息共有4项,从左到右依次是:
1. 院校名称,不多于15个字符,可能含有汉字。
2. 院校电话,不多于15个字符,只含有数字或空格或连字符(-)。
3. 院校编号,不多于6个字符,只含有数字和字母。
4. 归属地,不多于8个字符。只含有字母。
接下来是若干行(至少1行,不多于100行)学生信息,直到遇到下一条院校信息。
院校信息与学生信息的区别是:第一项如果是一个0~100间的整数,则为学生信息,否则为院校信息。
学生信息一共4项,从左到右依次是:
成绩,1~100的整数。
参赛组别,不多于10个字符,只含英文和数字。
学生电话,不多于15个字符,只含有数字或空格或连字符(-),该信息可能为空。
学生姓名,不多于6个字符,可以包含汉字。
院校的信息不超过1000行,且每个参赛院校只有一条信息。
所有信息项,除了学生电话一项外,均不为空。
要求编程,读入in.txt文件,按照新的格式组织输出到out.txt
具体要求:
1. 编码方式为GB2312
2. 输出信息为每个学生占一行,包含其所属院校的信息。
3. 输出信息的顺序,按照信息在in.txt出现的先后顺序
4. 每个信息项占用固定的宽度(注意每个汉字的输出宽度为2),其宽度规格明细为:
院校名称:30
院校电话:16
院校编号:6
归属地: 8
学生成绩:4
参赛组别:10
学生电话:16
学生姓名:12
5. 每项信息在其宽度区间内左对齐,不足宽度用西文空格填充(注意不是用tab制表符)。
6. 归属地是如下字符串的,输出用等号后的汉字串代替:
xijing=西京
lushan=鲁山
pingyang=平阳
danling=丹凌
xinyuan=新元
如果输入文件如in.txt所示,输出则应为out.txt所示,即输出文件内容为:
na005 aaa工程技术学院 010-21345673 西京 张小林 java 84 13553001115
na005 aaa工程技术学院 010-21345673 西京 李自云 c 67 13725330616
na005 aaa工程技术学院 010-21345673 西京 肖为 java 25 13312349988
km008 bbb理工大学 094-32421233 鲁山 徐路 c 81 18997111533
km008 bbb理工大学 094-32421233 鲁山 曹丽 java 92
mt009 ccc传媒大学 041-44441233 linhai 夏侯艺人 c++ 88 15900010002
选手注意:
1. 我们在评价您的代码的时候,用的是完全不同的测试数据,但其格式与in.txt相同。
2. 请把所有java类写在一个文件中,调试通过,拷贝至:“解答”文件夹下:“解答.txt”即可。
不要拷贝相关的工程、配置等文件。
3. 代码中只能使用jdk5.0兼容的API,不能使用更高版本的特性。代码中不要使用package语句。
public class T4 {
public static void main(String[] args) throws Exception{
File f1 = new File("in.txt");
BufferedReader read = new BufferedReader(new InputStreamReader(new FileInputStream(f1),"GB2312"));
File f2 = new File("out.txt");
f2.createNewFile();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f2), "GB2312"));
String strinfo; //存放一行信息
String[] info; //存放一行信息以":"分解后
String schoolInfo = ""; //存放学校信息
while((strinfo = read.readLine()) != null) {
info = strinfo.split(":");
if(!isNumber(info[0])) { //如果是学校信息
schoolInfo = String.format("%-6s%-"+(30-chineseNum(info[0]))+"s%-16s%-8s", info[2], info[0], info[1], getGuiShuDi(info[3]));
} else { //学生信息
String studentInfo = String.format("%-"+(12-chineseNum(info[3]))+"s%-10s%-4s%-16s", info[3], info[1], info[0], info[2]);
writer.write(schoolInfo + studentInfo);
writer.newLine();
}
}
read.close();
writer.close();
}
public static boolean isNumber(String str) {
if(str.length()>2) return false;
for(int i=0; i<str.length(); i++) {
char c = str.charAt(i);
if(c<'0' || c>'9') {
return false;
}
}
return true;
}
public static String getGuiShuDi(String str) {
if(str == "xijing") {
return "西京";
}
if(str == "lushan") {
return "鲁山";
}
if(str == "pingyang") {
return "平阳";
}
if(str == "danling") {
return "丹凌";
}
if(str == "xinyuan") {
return "新元";
}
return "";
}
public static int chineseNum(String str) throws UnsupportedEncodingException { //获得汉字个数
return str.getBytes("gb2312").length - str.length();
}
}
本题涉及文件格式转换,要求将原始数据重新组织并输出到新文件中,同时需遵循特定的数据格式规范。
2260

被折叠的 条评论
为什么被折叠?



