1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
'scripts_ApplyStringLength.sbs
' Файлы "Шаблон.sav" and "Другой файл.sav" имеют переменные числового и строгового форматов
'Данный скрипт работает со строковыми переменными из обоих файлов, которые имеют одинаковые имена,
' но разную длину.
'Скрипт предлагает пользователю указать путь к файлу "Шаблон.sav", затем - к файлу "Другой файл.sav".
' Далее скрипт меняет длину каждой строковой переменной в файле "Другой файл.sav" на длину
' соответствующей строковой переменной из файла "Шаблон.sav".
' ВНИМАНИЕ: В случае, если в файле "Другой файл.sav" строковые переменные были длиннее, чем
' в "Шаблон.sav", часть данных из них может быть потеряна!
' Автор: Raynald Levesque, 15.06.2003

' "Шаблон.sav" и "Другой файл.sav" - имена собирательные и означают имена ваших файлов.

Option Explicit

Sub Main()
	Dim strCmdOtherFile As String
	Dim StrCmd As String

	'Просим пользователя открыть файл Шаблон.sav
	Call GetFile("Откройте файл шаблона", StrCmd)
	Call GetInfo("info from template")

	'Просим пользователя открыть Другой файл.sav
	Call GetFile("Откройте файл, который будет отформатирован по шаблону" ,strCmdOtherFile)
	Call GetInfo("info from other file")

	Call ReformatStringVars(strCmdOtherFile)
End Sub

Sub GetFile(strTitle As String ,StrCmd As String )
	'Получаем путь к файлу, указанному пользователем и выполняем команду GET FILE
	Dim strFPath As String
	strFPath=GetFilePath("*.sav", "sav", , strTitle,0)
	If strFPath ="" Then	'Если пользователь нажал "Отмена"
		Exit Sub
	Else		    		'Открываем файл в SPSS
		StrCmd = "GET FILE='" & strFPath & "'." & vbCrLf
		StrCmd = StrCmd & "EXECUTE." & vbCrLf
		objSpssApp.ExecuteCommands StrCmd , True
	End If
End Sub

Sub GetInfo(strTxtName As String)
' Сохраняем имя и длину каждой строковой переменной в текстовый файл strTxtName.
	Dim objDataDoc As ISpssDataDoc
	Dim objDocuments As ISpssDocuments

	' Определим переменные, в которые будет сохранена информация о структуре файла данных.
	Dim numVars As Long
	Dim vrtVarNames As Variant, vrtVarLabels As Variant, vrtVarTypes As Variant
	Dim vrtMsmtLevels As Variant, vrtLabelCounts As Variant
	Dim strFPath As String
	Dim lngCnt As Long	'счётчик цикла
	Dim StrCmd As String

	Set objDocuments = objSpssApp.Documents
	Set objDataDoc=objDocuments.GetDataDoc(0)
	numVars = objDataDoc.GetVariableInfo(vrtVarNames, vrtVarLabels, _
			vrtVarTypes, vrtMsmtLevels, vrtLabelCounts)

	Debug.Clear
	Open "c:\\temp\\"& strTxtName & ".txt" For Output As #1
	For lngCnt = 0 To numVars -1
		'Debug.Print x & " " & vrtVarNames(lngCnt) & " " & vrtVarTypes(lngCnt)
		If vrtVarTypes(lngCnt) > 0 Then 'This is a string variable
			Print #1,vrtVarNames(lngCnt); vrtVarTypes(lngCnt)
		End If
	Next
	Close #1
End Sub

Sub ReformatStringVars(strFileCmd As String)
' Читаем формат строковых переменных в файлах шаблона и другом файле данных (из созданных текстовых файлов),
' составляем файл синтаксиса, чтобы создать из двух текстовых файлов файл sav file, затем
' составляем синтаксис, чтобы отформатировать переменные в Другом файле.
	Dim StrCmd As String

	'Сохраняем информацию о переменных шаблона в файл sav.
	StrCmd = StrCmd &"DATA LIST FILE='c:\\temp\\info from template.txt' LIST /vname(A8) vlength(F3)." & vbCrLf
	StrCmd = StrCmd &"COMPUTE template=1." & vbCrLf
	StrCmd = StrCmd &"SORT CASES BY vname." & vbCrLf
	StrCmd = StrCmd &"SAVE OUTFILE='c:\\temp\\info temp.sav'." & vbCrLf

	'Сохраняем информацию о переменных Другого файла в файл sav, сливаем 2 файла sav
	StrCmd = StrCmd &"DATA LIST FILE='c:\\temp\\info from other file.txt' LIST /vname(A8) vlength(F3)." & vbCrLf
	StrCmd = StrCmd &"COMPUTE template=0." & vbCrLf
	StrCmd = StrCmd &"SORT CASES BY vname." & vbCrLf
	StrCmd = StrCmd &"MATCH FILES FILE='c:\\temp\\info temp.sav'" & vbCrLf
	StrCmd = StrCmd &"	/RENAME (vlength = vtarget)" & vbCrLf
	StrCmd = StrCmd &"	/FILE=*" & vbCrLf
	StrCmd = StrCmd &"	/BY=vname." & vbCrLf
	StrCmd = StrCmd &"EXECUTE." & vbCrLf

	'Составляем синтаксис по переформатированию строковых переменных
	StrCmd = StrCmd &"SELECT IF vtarget<>vlength." & vbCrLf
	StrCmd = StrCmd &"STRING nformat(A4)." & vbCrLf
	StrCmd = StrCmd &"COMPUTE nformat=CONCAT('A',LTRIM(STRING(vtarget,F3)))." & vbCrLf
	StrCmd = StrCmd &"WRITE OUTFILE='c:\\temp\\syntax.sps'" & vbCrLf
	StrCmd = StrCmd &"	/'STRING temp1234('nformat').'" & vbCrLf
	StrCmd = StrCmd &"	/'COMPUTE temp1234='vname'.'" & vbCrLf
	StrCmd = StrCmd &"	/'MATCH FILES FILE=* /DROP='vname'.'" & vbCrLf
	StrCmd = StrCmd &"	/'RENAME VARIABLE (temp1234='vname').'." & vbCrLf
	StrCmd = StrCmd &"EXECUTE." & vbCrLf
	objSpssApp.ExecuteCommands (StrCmd,True)

	'Открываем Другой файл (который должен быть отформатирован) и изменяем длину строковых переменных
	objSpssApp.ExecuteCommands (strFileCmd, True)
	objSpssApp.ExecuteCommands ("INCLUDE 'c:\\temp\\syntax.sps'." & vbCrLf , True)
End Sub