2013-07-23 4 views
2

СТРУКТУРА ДАННЫХ: У меня есть набор данных, который можно считать файлом Excel или CSV. Он имеет следующие типы переменных: даты, время, числовые переменные и то, что должно быть числовыми переменными, которые некорректно имеют символы, прикрепленные к числу - например. -0.011 * и 0.023954029324) (скобки в конце находятся в ячейке) - из-за ошибки в программе, которая написала файл. Между каждой записью также есть пустые строки, и это нереально удалить все из них, поскольку у меня есть сотни файлов для управления.Импорт данных с недопустимыми символами в числовых столбцах

DATA ISSUE: Мы определили, что некоторые значения верны до символа (т.е. -0.011 верен, пока звездочка удалена), в то время как другие значения, такие как 0.023954029324), являются совершенно неправильными и должны быть сделано отсутствует. Пожалуйста, не комментируйте эту проблему, поскольку она вне моего контроля, и на этом этапе все, что я могу сделать, - это управлять данными до тех пор, пока ошибка не будет исправлена, а значения символов перестанут записываться в файлы.

ПРОБЛЕМА SAS:

1) Если я использую PROC ИМПОРТ с файлом Excel, SAS использует первые восемь строк (20 для файла CSV), чтобы определить, является ли переменная числом или символом. Если звездочка скобок не встречается в первых 20 строках, SAS говорит, что переменная является числовой, а затем пропускает любые последующие ячейки с символьными значениями. Это не нормально в случае звездочек, потому что я хочу сохранить числовую часть значения и удалить звездочку на более позднем этапе данных. Импорт файлов Excel с помощью PROC IMPORT не позволяет использовать параметр GUESSINGROWS (как и файлы CSV, см. Ниже). Изменить: Кроме того, параметр MIXED = YES НЕ работает (см. Комментарии ниже - по-прежнему необходимо изменить количество строк, используемых SAS, что для меня означает, что этот параметр делает ... что?).

2) Если я использую PROC IMPORT с CSV-файлом, я могу указать GUESSINGROWS = 32767, и я действительно взволнован, потому что тогда он определяет переменные со звездочками, которые являются символами и поддерживают звездочки. Тем не менее, это очень странно уже не определяет переменные с круглыми скобками как символ (как это было бы при импорте файла Excel, если скобка была в первых 20 строках), но вместо этого удаляет символ и дополнительно округляет значение до ближайший целое число (0.1435980234 становится 0, 1.82149023843 становится 2, и т.п.). Это слишком грубое округление - мне нужно поддерживать десятичные знаки. И, кроме того, скобки теперь исчезли, поэтому я не могу убрать соответствующие ячейки. Я не знаю, есть ли способ сделать SAS не круглым и/или поддерживать круглые скобки. Для меня это противоречивое поведение - почему в этом случае символ звездочки, но не круглый скот, считается символом? Кроме того, когда я прочитал в файле Excel w/PROC IMPORT (как описано в (1)), он может cope w/круглые скобки (если они появляются в первых 20 строках) - другое несоответствие.

3) Если я использую INFILE, ну, я получаю сообщение об ошибке с каждой переменной, которую я пытаюсь прочитать, - эта процедура слишком чувствительна и нестабильна в отношении того, как изменяются данные (и я должен закодировать рабочий процесс, вокруг для пустых строк данных).

ULTIMATE GOAL (обратите внимание будет запускаться автоматически в макросе этого код, если это имеет значение):

1) Считайте переменную дату как дата

2) Читать переменное время как раз

3) Уметь идентифицировать переменную w/characters, присутствующую в любой ячейке этой переменной (даже после 20 строк) в качестве символьной переменной, и поддерживать значения в ячейках (т. Е. Не округлять/удалять символ). Это может быть путем априорного указания SAS, чтобы позволить определенному набору переменных быть символом (я изменю их на числовые, после того как я избавлюсь от символов/сделаю ячейки неактивными), или SAS самостоятельно идентифицирует переменные w/characters.

ответ

1
  1. SAS фактически по умолчанию использует первые 8 строк. Это определено в параметре реестра TYPEGUESSROWS, который обычно хранится в HKLM \ Software \ Microsoft \ Office \ 14.0 \ Access Connectivity Engine \ Engines \ Excel \ TypeGuessRows \ (или вставлять-ваш-офис-версия-там). Измените это значение на FFFF (hex)/65536 (десятичное) или какое-либо другое большое число или ноль, чтобы найти максимальное количество строк (бит более 16000 - точное число трудно найти).

  2. Для CSV-файла вы можете написать импорт данных для управления форматами каждой переменной. Самый простой способ увидеть это - запустить PROC IMPORT, а затем проверить свой журнал; журнал будет содержать полный код, используемый для чтения в файле на шаге данных. Затем просто измените информационные данные по мере необходимости. Вы говорите, что у вас слишком много проблем с методом Infile, так что, возможно, это не сработает для вас, но, как правило, вы можете обойти любые несоответствия - и если ваши файлы ТАК противоречивы, это звучит так, будто вы будете заниматься тонкой ручной работой так или иначе. Это дает вам возможность правильно читать данные о дате/времени.

  3. Вы также можете использовать PROC IMPORT/CSV в журнале, записывая выход в файл, затем читать THAT и генерировать новый код импорта самостоятельно - или даже от содержимого proc сгенерированного файла, делая известных модификаций.

Не знаете, о чем вы спрашиваете, с датой/временем, поскольку вы не упоминаете проблемы с ним в первой части вашего вопроса.

Еще одна дополнительная опция - очистить символы до их чтения (из CSV). Это довольно просто, если это действительно просто Числовые и запятые (и десятичные и отрицательные признаки):

data mydata; 
infile myfile /*options*/; 
input @@; 
length infileline $32767; *or your longest reasonable line; 
infileline = compress(_infile_,'.-','kd'); 
run; 

data _null_; 
set mydata; 
file myfile /*options*/ /*or a new file if you prefer */; 
put @1 infileline $32767.; *or your longest reasonable line; 
run; 

Затем прочитал, что новый файл в использовании импорта Proc. Я разделяю его на два файла, чтобы вы могли его увидеть, но вы могли бы объединить их в один для удобства работы - посмотрите «обновление файла на месте» в документации SAS. Вы также можете выполнить эту очистку с помощью специальных инструментов ОС; в Unix, например, короткий скрипт awk может легко удалить неверные символы.

+0

Кроме того, если у вас возникли проблемы с импортом CSV, я рекомендую перейти к журналу и посмотреть, что импорт выбрал для формата переменной; что, по крайней мере, скажет вам, где это происходит. – Joe

+0

Спасибо за информацию, Джо. 1) Я видел, как некоторые источники говорят, что восемь, а некоторые говорят 20 - я не был уверен, было ли это иначе, в зависимости от типа файла. 2) Да, журнал показывает, что он идентифицирует переменную с круглыми скобками как запятую12. тип. Проблема в том, что не всегда одни и те же переменные имеют символы, поэтому определение информатики для каждого из них не является идеальным. Тем не менее, я считаю, что лучшим решением является выход из журнала и принудительное изменение всех переменных, которые могут иметь характерные значения, а затем изменить их все на числовые после того, как поврежденные ячейки были обработаны w /. – Meg

+0

Продолжение сверху: 3) Я написал, что мне нужна дата/время, чтобы уточнить, какие типы переменных необходимо поддерживать, что может быть актуальным, если у кого-то есть предложение, основанное на INFILE, например. 4) Спасибо! – Meg