题目名称 556. 解析程序
输入输出 parser.in/out
难度等级 ★★
时间限制 1000 ms (1 s)
内存限制 128 MiB
测试数据 11
题目来源 Gravatarcqw 于2011-07-21加入
开放分组 全部用户
提交状态
分类标签
分享题解
通过:1, 提交:15, 通过率:6.67%
Gravatar老虎小飞 100 0.026 s 0.36 MiB Pascal
Gravatar.Xmz 90 0.003 s 0.31 MiB C++
Gravatar.Xmz 90 0.004 s 0.31 MiB C++
Gravatar.Xmz 72 0.003 s 0.31 MiB C++
Gravatar苏轼 36 0.003 s 0.26 MiB C++
Gravatar苏轼 36 0.003 s 0.26 MiB C++
Gravatar苏轼 36 0.003 s 0.26 MiB C++
Gravatar苏轼 36 0.003 s 0.26 MiB C++
Gravatarecho 36 0.015 s 0.12 MiB Pascal
Gravatar.Xmz 27 0.027 s 0.31 MiB C++
本题关联比赛
20110722
20110722
关于 解析程序 的近10条评论(全部评论)

556. 解析程序

★★   输入文件:parser.in   输出文件:parser.out   简单对比
时间限制:1 s   内存限制:128 MiB

 

【问题描述

    CSV(逗号分隔值)这种文件格式可以在不同的应用程序间做数据交换用,因为曾被用于微软的电子表格(Excel),并逐渐成为一种行业伪标准,甚至也被应用于其它非微软平台上。
   本题中的CSV文件格式是这样定义的:
   1、一个CSV文件包含0行或多行记录,每一个记录包含0个或多个字段(域)。
   2、每一个记录都以一个换行符结尾(ASCII/LF=0X0A)。
   当然,一个字段中可能包含自带的换行符(参见下面),所以一个记录也可能跨越多行。
   3、字段之间以逗号(英文半角)分隔。
   例:Jonh,Doe,120 any st.,"Anytown, WW",08123
   4、如果一个字段未用双引号引起来,那么该字段开头或结尾的空格将被忽略。
   比如,John, Doe,…就可以变成"John"和"Doe",等等……空格可以是空格键或者Tab键。
   5、字段中若有自带的逗号,则必须用双引号引起来。
   在上例中,"Anytown, WW"必须加双引号,因为它中间有一个自带的逗号。
   6、字段中若有自带双引号,则该字段必须整体被双引号括起来,同时对于原来自带的双引号,每一个双引号都要被替换成两个连续的双引号。
   比如,John "Da Man" Doe将被转换成"John ""Da Man"" Doe",120 any st.,…
   7、如果一个字段中包含自带的换行,则该字段必须完整地用双引号括起来。
   比如,
   字段1:Conference room 1
   字段2:John,
   Please bring the M.Mathers file for review
   -J.L.

   字段3:10/18/2002
   …
   该记录可以转换为:
   Conference room 1,"John,
   Please bring the M.Mathers file for review
   -J.L.
   ",10/18/2002,…
   注意这是符合CSV格式的单个记录,尽管它跨越了多行,因为字段中有自带的换行。
   8、字段中若开头或结尾要用空格,则该字段需加双引号。
   如:为了保持开头与结尾的空格,John, Doe ,…要被写为John," Doe ",…
   9、字段可以总是用双引号括起来,而双引号也总是可以被去掉。
   你的任务是写一个程序做为CSV文件解析程序,对输入的CSV格式的文件做解析。
 
【输入格式】
   你的程序需要读入输入文件,并参考CSV文件格式对输入内容加以解析,输入以EOF结束。
   每一个字段的字符数均不超过50,输入文件中最多有500个字段。
【输出格式】

   如果输入文件不是一个符合CSV格式的文件,输出“Wrong Format”,否则你需要输出所有的字段,每一个字段输出完毕请加上一个换行(‘ ’),例如,假定输入文件如下:
   field11,field12,...,field1n
   field21,field22,...,field2n
   …
   fieldm1,fieldm2,...,fieldmn
   则输出必须为:
   field11
   field12
   ...
   field1n
   field21
   field22
   ...
   field2n
   …
   fieldm1
   fieldm2
   ...
   fieldmn
   注意字段中可能会有自带的换行符,所以在输出文件中一个字段可能会占若干行(具体细节你可以参考下面的样例3)。

【输入样例】
输入文件名:parser1.in
field11,field12
field21,field22
输出文件名:parser1.out
field11
field12
field21
field22
输入文件名:parser2.in
John, Doe , "Anytown, WW" , "John ""Da Mon"" Von"
输出文件名:parser2.out
John
Doe
Anytown, WW
John "Da Mon" Von
输入文件名:parser3.in
Conference room 1,"John,
Please bring the M.Mathers file for review
-J.L.
",3/20/2006
输出文件名:parser3.out
Conference room 1
John,
Please bring the M.Mathers file for review
-J.L.
3/20/2006
注意:
在这个样例中,输入文件中的第二个字段被双引号括起来了,于是在中间可以有换行符,也因此该字段在输出文件中看起来跟在输入文件中一样,不要忘了在该字段输出完毕、第三个字段输出之前加一个换行。
输入文件名:parser4.in
John, "Wrong field" sample", Bob
输出文件名:parser4.out
Wrong Format