0

我收到了一个我从未见过的格式的数据文件。数据似乎不是在列中,而是在一个长行中。我可以打开文件Notepad并查看数据。因此,数据似乎没有被加密。

当我在数据行中打开数据文件时,当我猜测数据达到单行允许的最大字符数时Notepad,数据会回绕到窗口的左侧,然后数据在新行中继续。NotepadNotepad

当我在Notepad. 这些行之一中的数据与其上方或下方的行中的数据不对齐。

以下是一些示例数据:

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 ;

如果我使用右箭头键一次将光标向右移动一个字符在第一行数据上,我必须按右箭头键两次才能移动超出字符空间 120 in Notepad

所有这些都告诉我数据文件中存在隐藏字符,用于识别一行数据的结尾。

我打开数据文件Vim希望看到这些隐藏的字符,但什么也没看到。 Vim我打开文件时确实正确对齐了列。所以,Vim一定是看到了这些隐藏的行尾字符。

我自己如何才能看到这些行尾字符?我怀疑有一个选项Vim可以显示隐藏的字符。

如何确定创建此数据文件的应用程序?

如何修改上述SAS代码以正确读取此数据文件?

4

2 回答 2

0

以下是如何查看隐藏的行尾字符gVim 7.4

  1. 打开gVim 7.4

  2. 打开数据文件在gVim 7.4

  3. 按下该escape键几次以访问行编辑器。注意按退出键

将导致gVim 7.4窗口上没有可见的结果。

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

  2. 按下enter

完成上述操作后,我$在每行的末尾看到一个蓝色,我认为这是一个行尾隐藏字符。

也许如果我能够删除这些蓝色$符号并将结果保存在一个新名称下,SAS也许能够读取该新数据文件。如果我弄清楚这一点,我将发布更新。

编辑

我试图修改 John Black 在此处发布的说明以删除 $,但到目前为止没有运气:Read csv file with hidden or invisible character ^M

我输入:%s/$//g了将 blue 替换为$yellow $。然后我以新名称保存文件并使用gVim. 但是当我输入:set list蓝色$仍然存在于新文件中。

于 2014-08-12T14:38:47.837 回答
0

首先,仔细检查您的 LRECL。你基本上丢失了一半的数据,这让我觉得你每行读两行。您将 207 显示为最大行大小,它应该低于默认的 256 LRECL,但是看到大约是正确数字的 1/2 的数字让我认为您在那里犯了一个错误。

接下来,弄清楚您是否基本上看到每隔一行,或者您是否看到前 44k 行然后突然停止。如果是后者,您1A的数据中有一个 DOS EOF 字符 ( ),您需要设置该IGNOREDOSEOF选项。如果是前者,那么你有一个明显的 LRECL 问题,或者你可能有一个不明显的 LRECL 问题,这是由占用多个字节的 unicode 字符引起的(尝试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.在理论上使用(但可能希望制作您的 lrecl256以防hex512.万一)。由于我们使用RECFM=F的是 ,因此我们的想法是让 LRECL 比您的实际行长更长,因此您可以在一次运行中看到一整行。(如果一行没有告诉您足够多的信息,请使用firstobs=导航到后面的行,认识到如果您的 LRECL 不完全适合数据,您将不会跳到真正行的开头,而是跳过256 字节块)。

这将为您提供两个字符串,一个是“可见”字符串,这可能有助于查看 SAS 在什么位置的想法,一个是可见字符串后面的十六进制代码。假设您处于 ASCII 环境(不是 DBCS 或 Unicode 环境)中,十六进制代码是每个字符 2 个值(一个字节 = 2 个十六进制值)。有关 ASCII 代码的列表,请参阅此页面

要查找的十六进制代码:

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

如果这是一个 Windows/Dos 文档,您应该在行尾连续看到 CRLF,即连续在0D0A207 左右的某个位置。如果这是一个 Unix 文档,您将在0A那里看到。如果这是 Mac OS 文档,您可能会看到 LFCR 或0A0D. 为什么有人想要保持一致。

你可能会看到一些东西,因为你得到了一些行。(如果没有行终止符,SAS 只会在第一行之后放弃。)您更有可能遇到以下问题之一:

  • 这是一个 DBCS 文件,因此所有字符实际上都占用了一个字节以上。如果您看到很多字符00或字符40之间20(例如,每个字符都有一个),则您有一个 DBCS(双字节字符集)文件 - 这就是 Windows 操作系统的中文或日文副本可能会产生的内容。他们为每个字符使用两个字节,以便用他们的语言表示完整的字符集;但即使在存储英文文档时,它们仍然使用全套 - 基本上只是添加一个填充字节,以便对于不兼容的程序(或未正确设置的程序,如本例中的 SAS)仍然具有合理的 ASCII 外观。
  • 这是一个 UTF-8 文件,其中字符可能占用多个字节(但可能不会)。在这种情况下,当您以这种方式查看数据时,您可能会在数据中看到一些“垃圾”,并且每隔一段时间,您就会看到一个占据两个或三个空格的字符 - 通常完全充满“垃圾”字符。UTF-8 每个字符可以占用 1 到 4 个字节,通常是 2 的幂(即 1、2、4),但对于 ASCII 字符看起来“正常”(即,它占用 ASCII 并添加了很多,在00-7F 范围)。

我的直觉是你有一个 DBCS 文件,因为你粗略地跳过了每一行(虽然不完全是 - 而且你跳过的更多 - 这让我有点奇怪)。

于 2014-08-12T14:23:30.240 回答