簡體   English   中英

包含隱藏字符的水平格式的數據文件

[英]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 256hex512. 由於我們使用的是RECFM=F ,所以我們的想法是使RECFM=F長於實際行的長度,因此您可以一次查看整個行。 (如果一行沒有告訴您足夠多的信息,請使用firstobs=導航至下一行,並確認如果您的LRECL不完全適合該數據,則您不會跳到真實行的開頭,但跳過256個字節的塊)。

這將為您提供兩個字符串,一個為“可見”字符串,這可能有助於查看SAS認為在什么位置,一個為可見字符串后面的十六進制代碼。 假設您處於ASCII環境(不是DBCS或Unicode環境),則十六進制代碼是每個字符2個值(一個字節= 2個十六進制值)。 請參閱此頁面以獲取ASCII碼列表。

要查找的十六進制代碼:

  • 1A = DOS EOF字符。
  • 0A =低頻
  • 0D = CR

如果是Windows / Dos文檔,則應該在行尾連續看到CRLF,即在207左右的位置連續一行0D0A 。如果是Unix文檔,則在那里只能看到0A 如果這是Mac OS文檔,則可能會看到LFCR或0A0D 為什么有人要保持一致。

您可能會看到一些東西,因為您得到了一些行。 (如果沒有行終止符,SAS只會在第一行之后放棄。)您更有可能遇到以下問題之一:

  • 這是一個DBCS文件,因此所有字符實際上占用一個以上的字節。 如果你看到很多的004020個字符之間(比如,每一個角色都有一個),你有DBCS(雙字節字符集)文件-這是什么,比如說,Windows操作系統的一個中國人或日本人復制的內容可能產生。 他們為每個字符使用兩個字節,以表示其語言中的完整字符集。 但是即使存儲英語documnet,它們仍會使用完整集-基本上只是添加一個填充字節,以使不兼容的程序(或未正確設置的程序,例如SAS)仍然具有合理的ASCII外觀。
  • 這是一個UTF-8文件,其中的字符可能占用多個字節(但可能沒有)。 在這種情況下,以這種方式查看數據時,您可能會在數據中看到一些“垃圾”,並且每隔一段時間,您就會得到一個占用兩個或三個空格的字符-通常完全充滿“垃圾”字符。 UTF-8每個字符可以占用1到4個字節,通常為2的冪(所以1,2,4),但是對於ASCII字符來說看起來是“正常”的(即,它需要ASCII並增加很多,因此在00-7F范圍)。

我的直覺是,您有一個DBCS文件,因為您大致跳過了每隔一行(盡管不完全是-並且您要跳過的更多內容-這對我來說有點奇怪)。

這是在gVim 7.4如何查看隱藏的行尾字符的方法:

  1. 打開gVim 7.4

  2. gVim 7.4打開數據文件

  3. 幾次按escape鍵以訪問行編輯器。 注意按退出鍵

將不會在gVim 7.4窗口上顯示可見的結果。

  1. gVim 7.4窗口底部鍵入:set list

  2. enter

完成上述操作后,我會在每行末尾看到一個藍色的$ ,我認為這是行尾隱藏字符。

也許如果我能夠刪除這些藍色的$符號並將結果保存為新名稱,則SAS可能能夠讀取該新數據文件。 如果我知道了這一點,我將發布更新。

編輯

我試圖修改John Black在此處發布的說明以刪除$,但是到目前為止還沒有運氣: 讀取帶有隱藏或不可見字符^ M的csv文件

我輸入:%s/$//g ,將藍色$替換為黃色$ 然后,我以新名稱保存了文件,並使用gVim打開了新文件。 但是當我鍵入:set list ,藍色$仍然存在於新文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM