D******6 发帖数: 6211 | 1 【 以下文字转载自 Statistics 讨论区 】
发信人: Doha2006 (花猫), 信区: Statistics
标 题: 请教一个SAS读中文数据库的问题
发信站: BBS 未名空间站 (Sun Feb 21 23:45:37 2010, 美东)
我用SAS读一个中文数据库,字符字段
源文件如下:
id name address
1, 张三,北京市东城区
2,李四,北京市西城区
。。。
。。。
我用的代码如下:
DATA name;
infile 'G:\name.csv' DLM = ',' DSD MISSOVER;
input id $ name $ address $;
读到SAS里的结果如下:
id name address
1 张三 北京市东
2 李四 北京市西
现在出现的问题是,如果address太长或者任何字符字段长过8个都读不进去,读到SAS
里以后,只有4个中文字符,也就是字节长8 。不是说以$这样结尾读数据都是按照有多
长读多长么?还是哪里有什么限制,我没有打开?
谢谢指点! |
uq 发帖数: 1004 | 2 很專業
看上去需要改動字符串長度的定義?
【在 D******6 的大作中提到】 : 【 以下文字转载自 Statistics 讨论区 】 : 发信人: Doha2006 (花猫), 信区: Statistics : 标 题: 请教一个SAS读中文数据库的问题 : 发信站: BBS 未名空间站 (Sun Feb 21 23:45:37 2010, 美东) : 我用SAS读一个中文数据库,字符字段 : 源文件如下: : id name address : 1, 张三,北京市东城区 : 2,李四,北京市西城区 : 。。。
|
D******6 发帖数: 6211 | 3 但是这个字段的长度不是固定的。有的地址可能是10个汉字,有的可能是20个。所以,
我觉得应该让SAS自动读,逗号是分隔符。问题是,如果是英文字符字段,长短不一没
有问题,SAS分得清。就是中文的字段长短不同,SAS就只读8个(4个中文字符)。。。
【在 uq 的大作中提到】 : 很專業 : 看上去需要改動字符串長度的定義?
|
r****y 发帖数: 26819 | 4 缺省为8个字节
如果想更长,先用LENGTH说明,比如:
LENGTH address $ 12;
【在 D******6 的大作中提到】 : 【 以下文字转载自 Statistics 讨论区 】 : 发信人: Doha2006 (花猫), 信区: Statistics : 标 题: 请教一个SAS读中文数据库的问题 : 发信站: BBS 未名空间站 (Sun Feb 21 23:45:37 2010, 美东) : 我用SAS读一个中文数据库,字符字段 : 源文件如下: : id name address : 1, 张三,北京市东城区 : 2,李四,北京市西城区 : 。。。
|
D******6 发帖数: 6211 | 5 瓦,这个内行!
可是,一来这个字段不是固定长度的,有的可能是12个,有的可能是32个。。。
二来,这个length 在哪设?在data procedure里,还是在开头?
【在 r****y 的大作中提到】 : 缺省为8个字节 : 如果想更长,先用LENGTH说明,比如: : LENGTH address $ 12;
|
k***g 发帖数: 7244 | 6 你的源文件是 CSV,直接在 Excel 里用 VBA 吧,更简单些
Sub duoha()
For i = 1 To 2
Cells(i, "B") = Right(Cells(i, "A"), Len(Cells(i, "A")) - InStr(Cells(i, "A"
), ","))
Cells(i, "A") = Left(Cells(i, "A"), InStr(Cells(i, "A"), ",") - 1)
Next i
End Sub
这样生成的 column A 是 id, column B 是地址
【在 D******6 的大作中提到】 : 瓦,这个内行! : 可是,一来这个字段不是固定长度的,有的可能是12个,有的可能是32个。。。 : 二来,这个length 在哪设?在data procedure里,还是在开头?
|
D******6 发帖数: 6211 | 7 嗯。。。这个太专业了。。。。
我好几个表,只有这个是CSV的,我逐个转成EXCEL也麻烦,因为有些表特别大。。。上
million 记录。。。
这个SAS奇怪,如果是英文的字段,多长都能读,就是中文的,就读4个汉字。
A"
【在 k***g 的大作中提到】 : 你的源文件是 CSV,直接在 Excel 里用 VBA 吧,更简单些 : Sub duoha() : For i = 1 To 2 : Cells(i, "B") = Right(Cells(i, "A"), Len(Cells(i, "A")) - InStr(Cells(i, "A" : ), ",")) : Cells(i, "A") = Left(Cells(i, "A"), InStr(Cells(i, "A"), ",") - 1) : Next i : End Sub : 这样生成的 column A 是 id, column B 是地址
|
r****y 发帖数: 26819 | 8 取上限嘛,定义一个上限,就是数据库里表格里每一列,也是有上限的。
第一次用变量之前拿length定制一下就可以了。。。
【在 D******6 的大作中提到】 : 瓦,这个内行! : 可是,一来这个字段不是固定长度的,有的可能是12个,有的可能是32个。。。 : 二来,这个length 在哪设?在data procedure里,还是在开头?
|
r****y 发帖数: 26819 | 9 excel的行数上限太小了,换成mysql之类的试试看
【在 D******6 的大作中提到】 : 嗯。。。这个太专业了。。。。 : 我好几个表,只有这个是CSV的,我逐个转成EXCEL也麻烦,因为有些表特别大。。。上 : million 记录。。。 : 这个SAS奇怪,如果是英文的字段,多长都能读,就是中文的,就读4个汉字。 : : A"
|
D******6 发帖数: 6211 | 10 我刚试了,好像行了!
瓦,谢谢谢谢!
【在 r****y 的大作中提到】 : 取上限嘛,定义一个上限,就是数据库里表格里每一列,也是有上限的。 : 第一次用变量之前拿length定制一下就可以了。。。
|
|
|
D******6 发帖数: 6211 | 11 你们都会的这么多。。。我都是n久以前用的mysql了。。。现在都忘了。
你给的建议应该work了,我在继续试。。。
【在 r****y 的大作中提到】 : excel的行数上限太小了,换成mysql之类的试试看
|
k***g 发帖数: 7244 | 12 million 。。。 那还是别用 Excel 了,呵呵,Excel 最大也就支持六万多
observations
【在 D******6 的大作中提到】 : 嗯。。。这个太专业了。。。。 : 我好几个表,只有这个是CSV的,我逐个转成EXCEL也麻烦,因为有些表特别大。。。上 : million 记录。。。 : 这个SAS奇怪,如果是英文的字段,多长都能读,就是中文的,就读4个汉字。 : : A"
|
D******6 发帖数: 6211 | 13 嗯,是的。:)
不过,您记性太好了,VBA随手就来。。。我天天用SAS,也要看着手册或者就程序写代
码。。。
【在 k***g 的大作中提到】 : million 。。。 那还是别用 Excel 了,呵呵,Excel 最大也就支持六万多 : observations
|
k***g 发帖数: 7244 | 14 用到的 mysql 函数其实和 VBA 的一样,都是 Instr() 找 逗号,Left() Right() 切割
substring,就是 Loop 的结构不太一样
【在 D******6 的大作中提到】 : 你们都会的这么多。。。我都是n久以前用的mysql了。。。现在都忘了。 : 你给的建议应该work了,我在继续试。。。
|
D******6 发帖数: 6211 | 15 都不记得了。。。我现在常用的SAS和stata都经常混,必须得开卷编程,闭卷就乱了,
哈哈。
切割
【在 k***g 的大作中提到】 : 用到的 mysql 函数其实和 VBA 的一样,都是 Instr() 找 逗号,Left() Right() 切割 : substring,就是 Loop 的结构不太一样
|
k***g 发帖数: 7244 | 16 呵呵, VBA 比较 intuitive 啊,如果在 Stata 或者 R 里写这些东西,我也得去翻 h
elp 文档,不过我们不怎么用 SAS,所以吃你的 SAS 包子受之有愧:)
【在 D******6 的大作中提到】 : 嗯,是的。:) : 不过,您记性太好了,VBA随手就来。。。我天天用SAS,也要看着手册或者就程序写代 : 码。。。
|
r****y 发帖数: 26819 | 17 如果用mysql读csv,不用loop:
http://dev.mysql.com/doc/refman/5.1/en/load-data.html
就是一个命令
切割
【在 k***g 的大作中提到】 : 用到的 mysql 函数其实和 VBA 的一样,都是 Instr() 找 逗号,Left() Right() 切割 : substring,就是 Loop 的结构不太一样
|
D******6 发帖数: 6211 | 18 呵呵,我省事,就写SAS的包子了,总之是个SAS引得头。
是,其实EXCEL和VBA都挺强大的,就是得用。
好了,nite,今晚上解决了一个问题,很高兴!
也要谢谢罗尼!
h
【在 k***g 的大作中提到】 : 呵呵, VBA 比较 intuitive 啊,如果在 Stata 或者 R 里写这些东西,我也得去翻 h : elp 文档,不过我们不怎么用 SAS,所以吃你的 SAS 包子受之有愧:)
|
r****y 发帖数: 26819 | 19 load data local infile 'name.csv' into table contacts
fields terminated by ','
enclosed by '"'
lines terminated by '\n'
(id, name, address)
【在 D******6 的大作中提到】 : 【 以下文字转载自 Statistics 讨论区 】 : 发信人: Doha2006 (花猫), 信区: Statistics : 标 题: 请教一个SAS读中文数据库的问题 : 发信站: BBS 未名空间站 (Sun Feb 21 23:45:37 2010, 美东) : 我用SAS读一个中文数据库,字符字段 : 源文件如下: : id name address : 1, 张三,北京市东城区 : 2,李四,北京市西城区 : 。。。
|
D******6 发帖数: 6211 | 20 谢谢!以后我不去统计版贴问题了,就贴古典了。
【在 r****y 的大作中提到】 : 如果用mysql读csv,不用loop: : http://dev.mysql.com/doc/refman/5.1/en/load-data.html : 就是一个命令 : : 切割
|
|
|
k***g 发帖数: 7244 | 21 呵呵,我说的loop是切割 string 的loop,譬如 data set 中的 string 都是 tab 间隔
的,你没办法直接在 import 数据的时候用逗号切割啊
【在 r****y 的大作中提到】 : 如果用mysql读csv,不用loop: : http://dev.mysql.com/doc/refman/5.1/en/load-data.html : 就是一个命令 : : 切割
|
r****y 发帖数: 26819 | 22 FIELDS TERMINATED BY '\t'
还是可以不用loop
间隔
【在 k***g 的大作中提到】 : 呵呵,我说的loop是切割 string 的loop,譬如 data set 中的 string 都是 tab 间隔 : 的,你没办法直接在 import 数据的时候用逗号切割啊
|
k***g 发帖数: 7244 | 23 如果用 fields terminated by '\t' 还是无法切割逗号啊,譬如 在excel 中输入数据
,存为 tab 为分隔符的 csv,用文本打开,结构是这样的:
"张三,北京市西城区" 工人 已婚
"李四,北京市东城区" 农民 离异
你在 load 数据的时候无法同时兼顾 , 和 tab 啊
【在 r****y 的大作中提到】 : FIELDS TERMINATED BY '\t' : 还是可以不用loop : : 间隔
|
r****y 发帖数: 26819 | 24 这不是两个replace all就解决的问题嘛
replace all " to space
replace all , to tab
就算数据里有"和,还是一个regular expression replace all就解决了
【在 k***g 的大作中提到】 : 如果用 fields terminated by '\t' 还是无法切割逗号啊,譬如 在excel 中输入数据 : ,存为 tab 为分隔符的 csv,用文本打开,结构是这样的: : "张三,北京市西城区" 工人 已婚 : "李四,北京市东城区" 农民 离异 : 你在 load 数据的时候无法同时兼顾 , 和 tab 啊
|
j******n 发帖数: 21641 | 25 如果只是个别比较长,系统资源也很浪费啊
【在 D******6 的大作中提到】 : 嗯,是的。:) : 不过,您记性太好了,VBA随手就来。。。我天天用SAS,也要看着手册或者就程序写代 : 码。。。
|
k***g 发帖数: 7244 | 26 这个。。。如果允许 replace 的话,在 stata 里直接
insheet using xx.csv, tab
就可以了,比 mysql 的 syntax 还简单,呵呵
【在 r****y 的大作中提到】 : 这不是两个replace all就解决的问题嘛 : replace all " to space : replace all , to tab : 就算数据里有"和,还是一个regular expression replace all就解决了
|
r****y 发帖数: 26819 | 27 。。。随便一个编辑器都能做replace吧,啥时候不允许。。。
【在 k***g 的大作中提到】 : 这个。。。如果允许 replace 的话,在 stata 里直接 : insheet using xx.csv, tab : 就可以了,比 mysql 的 syntax 还简单,呵呵
|
D******6 发帖数: 6211 | 28 瓦,神仙们还在讨论。。。
好,以后我有问题,多在这里提,可以学到很多。。。哈哈。
【在 r****y 的大作中提到】 : 。。。随便一个编辑器都能做replace吧,啥时候不允许。。。
|