#csv #export #spss
Вопрос:
У меня есть набор данных в SPSS, см. Пример набора данных ниже. Это всего лишь пример, реальный обеспечивается отдельным внешним процессом и содержит больше столбцов и строк. Пустые значения задаются, как " "
в примере, но это также то, как пустые значения предоставляются в SPSS, они внутренне обрабатываются как пустые/пустые/отсутствующие значения.
data list list/FieldNam(a20) FormName(a20) FieldType(a20) Choices(a50) Required(F1) Identifier(a1) Minimum(f8) Maximum(f8).
begin data
"Field 1" "Form abc" "text" " " 1 "y" " " " "
"Field 2" "Form abc" "datetime" " " 1 "y" " " " "
"Field 3" "Form xyz" "radio" "0=never | 1=sometimes | 2=often | 3=always" " " " " " " " "
"Field 4" "Form xyz" "text" " " " " " " "1" "100"
"Field 5" "Form xyz" "radio" "0=no | 1=yes" " " " " " " " "
end data.
Затем я использую следующий синтаксис, чтобы сохранить его в виде текстового файла CSV.
SAVE TRANSLATE
/TYPE = CSV
/FIELDNAMES
/TEXTOPTIONS DELIMITER=',' QUALIFIER='"'
/OUTFILE = 'C:Tempmy_csv_file.csv'
/ENCODING='Windows-1252'
/REPLACE.
И полученный CSV-файл содержит следующее, с одиночными пробелами для пустых значений
FieldNam,FormName,FieldType,Choices,Required,Identifier,Minimum,Maximum
Field 1,Form abc,text, ,1,y, ,
Field 2,Form abc,datetime, ,1,y, ,
Field 3,Form xyz,radio,0=never | 1=sometimes | 2=often | 3=always, , , ,
Field 4,Form xyz,text, , , ,1,100
Field 5,Form xyz,radio,0=no | 1=yes, , , ,
Однако я бы хотел, чтобы пустые значения были просто пустыми, вот так:
FieldNam,FormName,FieldType,Choices,Required,Identifier,Minimum,Maximum
Field 1,Form abc,text,,1,y,,
Field 2,Form abc,datetime,,1,y,,
Field 3,Form xyz,radio,0=never | 1=sometimes | 2=often | 3=always,,,,
Field 4,Form xyz,text,,,,1,100
Field 5,Form xyz,radio,0=no | 1=yes,,,,
Поэтому мой вопрос заключается в том, можно ли экспортировать набор данных SPSS таким образом?
Экспортированный файл csv будет использоваться в качестве входных данных для другой системы, и он не может обрабатывать , ,
пустые значения. Я знаю, что могу открыть его в блокноте и просто выполнить поиск и замену по факту. Но я хочу максимально автоматизировать его, потому что экспорт будет использоваться чаще, так что это сэкономит много работы.
Ответ №1:
Информация с этой страницы предполагает, что можно вызвать скрипт: https://www.ibm.com/docs/en/spss-statistics/23.0.0?topic=reference-script
скрипт
SCRIPT
запускает скрипт для настройки программы или автоматизации регулярно выполняемых задач. Вы можете запустить базовый скрипт или скрипт на Python.
SCRIPT 'filename' [(quoted string)]
Эта команда вступает в силу немедленно. Он не считывает активный набор данных и не выполняет ожидающие преобразования. Дополнительные сведения см. в разделе Порядок команд.
История выпуска
Выпуск 16.0
Сценарии, выполняемые из
SCRIPT
команды, теперь выполняются синхронно с потоком синтаксиса команды.Выпуск 17.0
Введена возможность запуска скриптов на Python.
Пример скрипта Python для вызова после каждого экспорта для версии 17.0 или выше:
import fileinput
import os
filename = 'C:Tempmy_csv_file.csv'
postfix = '.bak'
with fileinput.FileInput(filename, inplace=True, backup=postfix) as file:
for line in file:
print(line.replace(', ', ',').replace(' ,', ','), end='')
try:
os.remove(filename postfix)
except FileNotFoundError as e:
pass
Скрипт выполняет простой поиск и замену. Я включил код для автоматического удаления временного файла резервной копии, хотя в руководстве по Python говорится, что он автоматически удаляет файл. Для меня это последовательно не работает в данный момент (таким образом, удаление файла вручную). Но вы можете удалить этот конкретный код, если он работает без него для вас.
Конечно, вы также можете использовать csv
модуль Python, повторить строки и записать их обратно в другой csv и т. Д. Смотрите документацию по этому вопросу здесь: https://docs.python.org/3/library/csv.html
Комментарии:
1. Запуск скрипта Python для автоматизации поиска и замены в файле экспорта после факта не идеален, но он работает. Я думаю, что это просто невозможно, используя только синтаксис SPSS, поскольку это единственный ответ. Так что я продолжу с этим, спасибо за пост.