SAS导入字段含逗号的CSV文件:如何正确读取Movie电影数据集
问题根源
你使用的CSV文件本身不符合标准规范:包含逗号的Name字段没有用双引号包裹,导致SAS默认的逗号分隔逻辑会把Name内部的逗号识别为字段分隔符,出现字段错位。
修正方案
由于你的CSV中,除了Name字段外,其余字段的位置和格式都是固定的:前两个字段为ID、Underage,最后三个字段为Rating、Year、Rank on IMDb,我们可以先把整行内容读入,再按规则拆分字段,就能完美规避Name含逗号的问题,代码如下:
FILENAME XX '你的Movie.csv实际存储路径'; data movieYY; infile XX firstobs=2 truncover; /* 先把整行内容读入一个长字符串变量 */ length whole_line $200 ID $5 Underage $3 Name $100 Rating 8 Year 8 'Rank on IMDb'n 8; input whole_line $char200.; /* 第一步:从右往左拆分最后3个固定字段 */ /* 找最后第一个逗号,拆分出IMDb排名 */ pos_rank = findc(whole_line, ',', 'B'); 'Rank on IMDb'n = input(strip(substr(whole_line, pos_rank+1)), best.); whole_line = substr(whole_line, 1, pos_rank-1); /* 找倒数第二个逗号,拆分出年份 */ pos_year = findc(whole_line, ',', 'B'); Year = input(strip(substr(whole_line, pos_year+1)), best.); whole_line = substr(whole_line, 1, pos_year-1); /* 找倒数第三个逗号,拆分出评分 */ pos_rating = findc(whole_line, ',', 'B'); Rating = input(strip(substr(whole_line, pos_rating+1)), best.); whole_line = substr(whole_line, 1, pos_rating-1); /* 第二步:从左往右拆分前两个固定字段 */ /* 找第一个逗号,拆分出ID */ pos_id = findc(whole_line, ','); ID = strip(substr(whole_line, 1, pos_id-1)); whole_line = substr(whole_line, pos_id+1); /* 找第二个逗号,拆分出Underage */ pos_underage = findc(whole_line, ','); Underage = strip(substr(whole_line, 1, pos_underage-1)); /* 剩下的内容全部是Name,不管含多少逗号都正确 */ Name = strip(substr(whole_line, pos_underage+1)); /* 删除过程变量 */ drop whole_line pos_:; run;
原代码问题说明
你之前写的代码只判断了第一个逗号后的内容是否为数字,逻辑覆盖不全:如果Name字段中包含多个逗号,还是会出现错位问题,而从两端拆分固定字段的逻辑可以兼容所有Name含逗号的情况。
内容的提问来源于stack exchange,提问作者konsteinuser
相关产品推荐
相关产品推荐

