任务:文件格式转换。
---------------------
在本题号对应的文件夹中,有一个示例输入文件:
“
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();
}
}