[英]data file in horizontal format containing hidden characters
提供了我從未見過的格式的數據文件。 數據似乎不在一列中,而是在一長行中。 我可以在Notepad
打開文件並查看數據。 因此,數據似乎沒有被加密。
當我在Notepad
打開數據文件時,當我猜測數據達到了Notepad
在單行中允許的最大字符數時,該行數據回繞到Notepad
窗口的左側,然后該數據以新的形式繼續行。
當我在Notepad
打開文件時,可能有10,000行數據。 這些行之一中的數據與其上方或下方的行中的數據不對齊。
以下是一些示例數據:
40001 1 5 GGGG 2998 HHHH SU111111 95 1.0 F1 4 1304 3 0 0
40001 1 5 GGGG 2998 HHHH SU111111 95 1.0 F1 4 0205 0 3 0
40001 1 5 GGGG 2998 HURG SU111111 95 1.0 F1 4 0805 0 2 0
40001 1 5 GGGG 2998 HHHH SU111111 95 1.0 F1 4 1205 0 2 0
40001 1 5 GGGG 2998 HHHH SU111111 95 1.0 F1 4 1505 0 0
40002 2 8 GGGG 2998 PPPP SK777777 -999 1.0 F3 4 2003 0 0
40002 2 8 GGGG 2998 PPPP SK777777 -999 1.0 F3 4 2303 2 0 0
40002 2 8 GGGG 2998 PPPP SK777777 -999 1.0 F3 4 2703 3 0 0
40002 2 8 GGGG 2998 PPPP SK777777 -999
請注意,當我在此處粘貼示例數據(代表Notepad
一行)時,各列“神奇地”對齊了。
我發現可以在Excel
打開數據文件,並且數據也對齊。 我確實需要在Excel
手動分配列邊界。 而且Excel
不允許我分配或多或少的字符空間123以外的列邊界。
下面是SAS
代碼來讀取數據文件,雖然這SAS
代碼不能正常工作。 相反,我猜想這個SAS
代碼會跳過一些數據行。 請注意,變量TT
覆蓋了字符空間125-207,但是大多數行中只有120個字符。 在某些行中有超過120個字符。 我懷疑行之間的字符數差異是SAS無法正確讀取此數據文件的原因。
option linesize = 210 ;
option pagesize = 30 ;
FILENAME myinput 'C:/Users/markm/simple SAS programs/mydata.new' ;
DATA mydata ;
INFILE myinput ;
INPUT
AA 2-9
BB 12-17
CC 18-22
DD $ 24-27
EE 30-33
FF $ 35-38
GG $ 40-47
HH 53-56
II 59-64
JJ $ 66-68
KK $ 70-71
LL 72-78
MM 79-85
NN $ 87-90
OO 91-95
PP 97-104
QQ 105-110
RR 112-120
SS $ 122-123
TT $ 125-207 ;
如果我使用右箭頭鍵一次將光標移到第一行數據上的右一個字符,則必須按兩次右箭頭鍵才能移出Notepad
字符空間120。
所有這些都告訴我,數據文件中有隱藏的字符,用於標識一行數據的結尾。
我在Vim
打開了數據文件,希望看到這些隱藏的字符,但是什么也沒看到。 打開文件時, Vim
確實正確對齊了列。 因此, Vim
必須看到這些隱藏的行尾字符。
我自己如何看到這些行尾字符? 我懷疑Vim
有一個選項可以顯示隱藏的字符。
如何確定創建此數據文件的應用程序?
如何修改上述SAS
代碼以正確讀取此數據文件?
首先,請仔細檢查您的LRECL。 您基本上丟失了一半的數據,這讓我覺得您正在為每一行分兩行閱讀。 您顯示207作為最大行大小,應該在默認的256 LRECL下,但是看到正確數字的1/2左右的數字會使我認為您在這里輸入了錯誤。
接下來,確定您是否基本上每隔一行看到一條,或者看到的是前44k行然后突然停止。 如果是后者,則數據中有一個DOS EOF字符( 1A
),並且需要設置IGNOREDOSEOF
選項。 如果是前者,則可能是上述明顯的LRECL問題,或者可能是由Unicode字符占用多個字節引起的非顯而易見的LRECL問題(嘗試LRECL=32767
看看是否可以解決;也將導致數據看起來每行的某個點很有趣),或者您遇到了一個奇怪的行終止符問題(盡管不一致)。
然后,假設EOL字符(或EOF?)存在問題,解決該問題的方法就是准確查看數據文件中的內容。
讀取一個虛擬字符,然后將_infile_
行放入hex.
格式。 例如:
data test;
infile "d:\temp\utf8.txt" lrecl=256 RECFM=f;
input @1 x $1. @;
r = repeat('1234567890',8); *make this appropriate for your LS option in your log;
put r;
put _infile_;
put _infile_ hex512.;
stop; *we want to see just one line here;
run;
在那種情況下,我要讀20行,並使用hex40.
,因為它必須是行長的兩倍。 您可以保留長度( hex.
),但是如果這樣做的話,您會得到一些非常長的行,其中包含大量的空白。 在您的情況下, lrecl=207
,您應該使用hex414.
從理論上講(但是為了以防萬一,可能要使您的lrecl 256
和hex512.
) 由於我們使用的是RECFM=F
,所以我們的想法是使RECFM=F
長於實際行的長度,因此您可以一次查看整個行。 (如果一行沒有告訴您足夠多的信息,請使用firstobs=
導航至下一行,並確認如果您的LRECL不完全適合該數據,則您不會跳到真實行的開頭,但跳過256個字節的塊)。
這將為您提供兩個字符串,一個為“可見”字符串,這可能有助於查看SAS認為在什么位置,一個為可見字符串后面的十六進制代碼。 假設您處於ASCII環境(不是DBCS或Unicode環境),則十六進制代碼是每個字符2個值(一個字節= 2個十六進制值)。 請參閱此頁面以獲取ASCII碼列表。
要查找的十六進制代碼:
如果是Windows / Dos文檔,則應該在行尾連續看到CRLF,即在207左右的位置連續一行0D0A
。如果是Unix文檔,則在那里只能看到0A
。 如果這是Mac OS文檔,則可能會看到LFCR或0A0D
。 為什么有人要保持一致。
您可能會看到一些東西,因為您得到了一些行。 (如果沒有行終止符,SAS只會在第一行之后放棄。)您更有可能遇到以下問題之一:
00
或40
或20
個字符之間(比如,每一個角色都有一個),你有DBCS(雙字節字符集)文件-這是什么,比如說,Windows操作系統的一個中國人或日本人復制的內容可能產生。 他們為每個字符使用兩個字節,以表示其語言中的完整字符集。 但是即使存儲英語documnet,它們仍會使用完整集-基本上只是添加一個填充字節,以使不兼容的程序(或未正確設置的程序,例如SAS)仍然具有合理的ASCII外觀。 我的直覺是,您有一個DBCS文件,因為您大致跳過了每隔一行(盡管不完全是-並且您要跳過的更多內容-這對我來說有點奇怪)。
這是在gVim 7.4
如何查看隱藏的行尾字符的方法:
打開gVim 7.4
在gVim 7.4
打開數據文件
幾次按escape
鍵以訪問行編輯器。 注意按退出鍵
將不會在gVim 7.4
窗口上顯示可見的結果。
在gVim 7.4
窗口底部鍵入:set list
按enter
鍵
完成上述操作后,我會在每行末尾看到一個藍色的$
,我認為這是行尾隱藏字符。
也許如果我能夠刪除這些藍色的$
符號並將結果保存為新名稱,則SAS
可能能夠讀取該新數據文件。 如果我知道了這一點,我將發布更新。
編輯
我試圖修改John Black在此處發布的說明以刪除$,但是到目前為止還沒有運氣: 讀取帶有隱藏或不可見字符^ M的csv文件
我輸入:%s/$//g
,將藍色$
替換為黃色$
。 然后,我以新名稱保存了文件,並使用gVim
打開了新文件。 但是當我鍵入:set list
,藍色$
仍然存在於新文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.