2019华为机试题 解析文本

解析文本

题目描述

有一种表格数据需要存储在文件中,表格中的每一行,由若干个字段组成,每个字段可以是整数或字符串,设计一种存储格式,采用文本的方式对表格数据进行存储。文本文件中的每一行,代表了表格数据中的一行数据。具体格式描述如下:
1、采用逗号分隔不同的字段(逗号前后无空格);
2、数字直接采用10进制的文本存储;
3、字符串的存储规则如下:
1)如果字符串中包含逗号以及双引号,则字符串必须在头尾各增加一个双引号,且中间的双引号用连续两个双引号表示。例如“a“”b”表示字符串a“b。
2) 如果字符串中未包含逗号及双引号,则字符串不强制要求在头尾增加双引号,可直接存储。例如abc,或者”abc“都可以。
4、空字符串不存储任何字符,例如a,b中,有3个字段,分别是:a,空字符,b。空字符输出–。

输入单行文本,解析为多个字段

解题思路

通过逗号将输入的字符串分割为多个子串存入str_list。从第一个子串开始,判断其是否符合字段的规则。若符合规则,则将该子串append至res_list。若不符合规则,则将分割掉的逗号和后一个子串拼接至当前子串,再次判断其是否符合规则,直至str_list为空。若当前依然不合规则,则输出error。

python代码

def is_legal(str_): 
	#判断字符串是否符合规则
	if '"' not in str_ and ',' not in str_:
		return True
	if ',' in str_ and '"' not in str_:
		return False
	if '"' in str_:
		if len(str_) == 1:
			return False
		if str_[0] is not '"' or str_[-1] is not '"':
			return False
		if '"' not in str_[1:-1]:
			return True
		sub_str = list(str_[1:-1])
		while sub_str:
			char = sub_str.pop(0)
			if char is '"':
				if not sub_str:
					return False
				if sub_str.pop(0) is not '"':
					return False
		return True
	
def cut_str(str_):
	#输出解析后的字段
	#输出:
	#		judge:字符串是否合法,非法则等于error
	#		res_list:解析后的字段
	str_list = str_.split(",")
	judge = ''
	res_list = []
	while str_list:	#循环判断子串是否合法
		f_str = str_list.pop(0)	#取出最前端的子串
		if is_legal(f_str):	#符合规则,存入res_list
			res_list.append(f_str)
		else:	#不符合规则
			while str_list:	#循环拼接子串
				f_str += ','	#拼接逗号
				f_str += str_list.pop(0)	#拼接后一个子串
				if is_legal(f_str):	#符合规则,存入res_list
					res_list.append(f_str)
					break;
			if not is_legal(f_str):		#str_list为空,但子串依然不符合规则,则judge为error			
				judge = 'ERROR'
				return judge, res_list
	return judge, res_list

if __name__ == '__main__':
	test_str = 'a,,1,"b,"""'
	judge, res_list = cut_str(test_str)
	if judge is 'ERROR':
		print(judge)
	else:
		print(len(res_list))
		for str_ in res_list:
			if str_:
				if str_[0] is '"' and str_[-1] is '"':	#若字符串带双引号,将中间存在的两个双引号替换为单个双引号
					print(str_[1:-1].replace('""', '"'))
				else:
					print(str_)
			else:
				print('--')

后记

通过率90%,仅做参考。

你可能感兴趣的:(2019华为机试题 解析文本)