VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Аватара пользователя
TRaMeLL

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение TRaMeLL »

TRaMeLL, в новом файле отсутствуют записи вида:


Цитата TRaMeLL:





Код:

Код: Выделить всё

Дата=…

VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой




Так что, начните с формулировки новых требований: что, как, откуда…
Аватара пользователя
TRaMeLL

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение TRaMeLL »

Я снова за помощью. В реальных условиях, после перехода на новую систему файл Kl_to_1c.txt оказался другим и скрипт на нем не срабатывает.

Iska, написал вам PM, надеюсь на вашу помощь.
Аватара пользователя
TRaMeLL

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение TRaMeLL »

Почему отсутствуют? Там просто вначале документа не нужная информация, потом идет так (кусок из того же файла):


читать дальше »


СекцияДокумент=Платежное поручение

Номер=289

Дата=03.09.2012

Сумма=19580

ПлательщикСчет=40702810123456789012

ДатаСписано=

Плательщик=ООО "Рога и Копыта" (СБ РФ N 2413 БРАТСКОЕ Г.БРАТСК)

ПлательщикИНН=1234567890

ПлательщикКПП=1238745

ПлательщикРасчСчет=40702810418090007406

ПлательщикБанк1=БАЙКАЛЬСКИЙ БАНК СБЕРБАНКА РОССИИ

ПлательщикБИК=042520607

ПлательщикКорсчет=30101810900000000607

ПолучательСчет=40802810000000000000

ДатаПоступило=03.09.2012

Получатель=ИП ИВАНОВ ПЕТР СИДОРОВИЧ

ПолучательИНН=123456789012

ПолучательКПП=

ПолучательРасчСчет=40802810000000000000

ПолучательБанк1=БАЙКАЛЬСКИЙ БАНК СБЕРБАНКА РОССИИ

ПолучательБИК=042520607

ПолучательКорсчет=30101810900000000607

ВидПлатежа=

ВидОплаты=01

СтатусСоставителя=

ПоказательКБК=

ОКАТО=

ПоказательОснования=

ПоказательПериода=

ПоказательНомера=

ПоказательДаты=

ПоказательТипа=

Очередность=6

НазначениеПлатежа=За материалы согл. счёта № КМ-206 от 22.08.2012г. Cумма 19580-00, |без налога (НДС).|

КонецДокумента



Результат должен быть, так же, вида: %Дата=% %Номер=% %Сумма=% %Плательщик=% %НазначениеПлатежа=%
Аватара пользователя
Iska

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение Iska »

Пробуйте:


читать дальше »




Код:

Код: Выделить всё

Option Explicit
Const adInteger  =   3
Const adCurrency =   6
Const adDate     =   7
Const adVarChar  = 200
Dim lngErrCode
Dim strSourceFile
Dim strLine
Dim objTS
Dim objRecordSet
Dim intNumberMaxLength
Dim intSummMaxLength
Dim intPlatMaxLength
If WScript.Arguments.Count = 1 Then
	strSourceFile = WScript.Arguments.Item(0)
	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FileExists(strSourceFile) Then
			Set objTS = .OpenTextFile(strSourceFile)
			With WScript.CreateObject("ADOR.Recordset")
				With .Fields
					.Append "Дата",                   adDate
					.Append "Номер",                  adVarChar, 2^5
					.Append "Сумма",                  adCurrency
					.Append "ДлинаСтрокиСумма",       adInteger
					.Append "Плательщик",             adVarChar, 2^15 - 1
					.Append "ДлинаСтрокиПлательщик",  adInteger
				End With
				.Open
				Do Until objTS.AtEndOfStream
					strLine = objTS.ReadLine()
					Select Case Split(strLine, "=")(0)
						Case "СекцияДокумент"
							.AddNew
						Case "Дата"
							If Len(Split(strLine, "=")(1))  0 Then
								.Fields.Item("Дата").Value = CDate(Split(strLine, "=")(1))
							End If
						Case "Номер"
							.Fields.Item("Номер").Value = CStr(Split(strLine, "=")(1))
						Case "Сумма"
							'SetLocale "en-us"
							.Fields.Item("Сумма").Value = CCur(Split(strLine, "=")(1))
							'SetLocale "ru"
							.Fields.Item("ДлинаСтрокиСумма").Value = Len(FormatCurrency(.Fields.Item("Сумма").Value, 2))
						Case "Плательщик", "Плательщик1"
							.Fields.Item("Плательщик").Value = CStr(Split(strLine, "=")(1))
							.Fields.Item("ДлинаСтрокиПлательщик").Value = Len(CStr(Split(strLine, "=")(1)))
					End Select
				Loop
				objTS.Close
				.Sort = "Номер DESC" : .MoveFirst
				intNumberMaxLength = Len(.Fields.Item("Номер").Value)
				.Sort = "ДлинаСтрокиСумма DESC" : .MoveFirst
				intSummMaxLength   = .Fields.Item("ДлинаСтрокиСумма").Value
				.Sort = "ДлинаСтрокиПлательщик DESC" : .MoveFirst
				intPlatMaxLength   = .Fields.Item("ДлинаСтрокиПлательщик").Value
				.Sort = "" : .MoveFirst
				Do Until .EOF
					With .Fields
						WScript.StdOut.Write Left(CStr(.Item("Дата").Value) & Space(10), 10) & vbTab
						WScript.StdOut.Write Right(Space(intNumberMaxLength) & CStr(.Item("Номер").Value), intNumberMaxLength) & vbTab
						WScript.StdOut.Write Right(Space(intSummMaxLength) & FormatCurrency(.Item("Сумма").Value, 2), intSummMaxLength) & vbTab
						WScript.StdOut.Write Left(CStr(.Item("Плательщик").Value) & Space(intPlatMaxLength), intPlatMaxLength)
						WScript.StdOut.WriteLine
					End With
					.MoveNext
				Loop
				.Close
			End With
			Set objTS = Nothing
			lngErrCode = 0
		Else
			WScript.StdErr.WriteLine "File [" & strSourceFile & "] not found"
			lngErrCode = 2
		End If
	End With
Else
	WScript.StdErr.WriteLine "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ """""
	lngErrCode = 1
End If
WScript.Quit lngErrCode





Если опять формат десятичных разделителей в файле и на машине не совпадает — раскомментируйте SetLocale'ы.
Аватара пользователя
TRaMeLL

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение TRaMeLL »

Обнаружилась очередная проблема. В новом формате исходного файла в параметре %Сумма=% не указан "-". Сразу этого не заметил. Поэтому в результирующем файле все суммы пишутся как кредит. Дебет теперь можно определить по наличию данных в параметре %ДатаСписано=% исходного файла (если дата присутствует, то операция - дебет, если дата отсутствует, то операция - кредит).

Теперь необходимо поправить скрипт таким образом, чтобы суммы на дебетовых операциях в результирующем файле были помечены знаком "-".
Аватара пользователя
TRaMeLL

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение TRaMeLL »

TRaMeLL, пробуйте:


читать дальше »




Код:

Код: Выделить всё

Option Explicit
Const adInteger  =   3
Const adCurrency =   6
Const adDate     =   7
Const adVarChar  = 200
Dim lngErrCode
Dim strSourceFile
Dim strLine
Dim objTS
Dim objRecordSet
Dim intNumberMaxLength
Dim intSummMaxLength
Dim intPlatMaxLength
If WScript.Arguments.Count = 1 Then
	strSourceFile = WScript.Arguments.Item(0)
	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FileExists(strSourceFile) Then
			Set objTS = .OpenTextFile(strSourceFile)
			With WScript.CreateObject("ADOR.Recordset")
				With .Fields
					.Append "Дата",                   adDate
					.Append "Номер",                  adVarChar, 2^5
					.Append "Сумма",                  adCurrency
					.Append "ДлинаСтрокиСумма",       adInteger
					.Append "Плательщик",             adVarChar, 2^15 - 1
					.Append "ДлинаСтрокиПлательщик",  adInteger
				End With
				.Open
				Do Until objTS.AtEndOfStream
					strLine = objTS.ReadLine()
					Select Case Split(strLine, "=")(0)
						Case "СекцияДокумент"
							.AddNew
						Case "Дата"
							If Len(Split(strLine, "=")(1))  0 Then
								.Fields.Item("Дата").Value = CDate(Split(strLine, "=")(1))
							End If
						Case "Номер"
							.Fields.Item("Номер").Value = CStr(Split(strLine, "=")(1))
						Case "Сумма"
							'SetLocale "en-us"
							.Fields.Item("Сумма").Value = CCur(Split(strLine, "=")(1))
							'SetLocale "ru"
							.Fields.Item("ДлинаСтрокиСумма").Value = Len(FormatCurrency(.Fields.Item("Сумма").Value, 2))
						Case "Плательщик", "Плательщик1"
							.Fields.Item("Плательщик").Value = CStr(Split(strLine, "=")(1))
							.Fields.Item("ДлинаСтрокиПлательщик").Value = Len(CStr(Split(strLine, "=")(1)))
						Case "ДатаСписано"
							If IsDate(Split(strLine, "=")(1)) Then
								.Fields.Item("Сумма").Value = - .Fields.Item("Сумма").Value
							End If
					End Select
				Loop
				objTS.Close
				.Sort = "Номер DESC" : .MoveFirst
				intNumberMaxLength = Len(.Fields.Item("Номер").Value)
				.Sort = "ДлинаСтрокиСумма DESC" : .MoveFirst
				intSummMaxLength   = .Fields.Item("ДлинаСтрокиСумма").Value
				.Sort = "ДлинаСтрокиПлательщик DESC" : .MoveFirst
				intPlatMaxLength   = .Fields.Item("ДлинаСтрокиПлательщик").Value
				.Sort = "" : .MoveFirst
				Do Until .EOF
					With .Fields
						WScript.StdOut.Write Left(CStr(.Item("Дата").Value) & Space(10), 10) & vbTab
						WScript.StdOut.Write Right(Space(intNumberMaxLength) & CStr(.Item("Номер").Value), intNumberMaxLength) & vbTab
						WScript.StdOut.Write Right(Space(intSummMaxLength) & FormatCurrency(.Item("Сумма").Value, 2), intSummMaxLength) & vbTab
						WScript.StdOut.Write Left(CStr(.Item("Плательщик").Value) & Space(intPlatMaxLength), intPlatMaxLength)
						WScript.StdOut.WriteLine
					End With
					.MoveNext
				Loop
				.Close
			End With
			Set objTS = Nothing
			lngErrCode = 0
		Else
			WScript.StdErr.WriteLine "File [" & strSourceFile & "] not found"
			lngErrCode = 2
		End If
	End With
Else
	WScript.StdErr.WriteLine "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ """""
	lngErrCode = 1
End If
WScript.Quit lngErrCode





Замечание:


Цитата Iska:



Если опять формат десятичных разделителей в файле и на машине не совпадает — раскомментируйте SetLocale'ы.
VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой




остаётся в силе.



Если возникнут ошибки с определением дебет/кредит — пишите. Сейчас просто полагаемся на то, что поле Сумма находится в секции ранее поля ДатаСписано. Если может быть обратное, то придётся усложнять разбор.
Аватара пользователя
TRaMeLL

Re: VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Сообщение TRaMeLL »

Спасибо! С определением, похоже, проблем нет. Немного переделал скрипт, конечный вид:


читать дальше »




Код:

Код: Выделить всё

Option Explicit
Const adInteger  =   3
Const adCurrency =   6
Const adDate     =   7
Const adVarChar  = 200
Dim lngErrCode
Dim strSourceFile
Dim strLine
Dim objTS
Dim objRecordSet
Dim intNumberMaxLength
Dim intSummMaxLength
Dim intPlatMaxLength
Dim intNazPlatMaxLength
If WScript.Arguments.Count = 1 Then
	strSourceFile = WScript.Arguments.Item(0)
	With WScript.CreateObject("Scripting.FileSystemObject")
		If .FileExists(strSourceFile) Then
			Set objTS = .OpenTextFile(strSourceFile)
			With WScript.CreateObject("ADOR.Recordset")
				With .Fields
					.Append "ДатаСписано",                  adDate
					.Append "ДатаПоступило",                adDate
					.Append "Номер",                        adVarChar, 2^5
					.Append "Сумма",                        adCurrency
					.Append "ДлинаСтрокиСумма",             adInteger
					.Append "Плательщик",                   adVarChar, 2^15 - 1
					.Append "ДлинаСтрокиПлательщик",        adInteger
					.Append "НазначениеПлатежа",            adVarChar, 2^15 - 1
					.Append "ДлинаСтрокиНазначениеПлатежа", adInteger
				End With
				.Open
				Do Until objTS.AtEndOfStream
					strLine = objTS.ReadLine()
					Select Case Split(strLine, "=")(0)
						Case "СекцияДокумент"
							.AddNew
						Case "ДатаСписано"
							If Len(Split(strLine, "=")(1))  0 Then
							.Fields.Item("ДатаСписано").Value = CDate(Split(strLine, "=")(1))
							.Fields.Item("Сумма").Value = - .Fields.Item("Сумма").Value
							End If					
						Case "ДатаПоступило"
							If Len(Split(strLine, "=")(1))  0 Then
								.Fields.Item("ДатаПоступило").Value = CDate(Split(strLine, "=")(1))
							End If
						Case "Номер"
							.Fields.Item("Номер").Value = CStr(Split(strLine, "=")(1))
						Case "Сумма"
							'SetLocale "en-us"
							SetLocale "en-us"
							.Fields.Item("Сумма").Value = CCur(Split(strLine, "=")(1))							
							'SetLocale "ru"
							SetLocale "ru"
							.Fields.Item("ДлинаСтрокиСумма").Value = Len(FormatCurrency(.Fields.Item("Сумма").Value, 2))
						Case "Плательщик", "Плательщик1"
							.Fields.Item("Плательщик").Value = CStr(Split(strLine, "=")(1))
							.Fields.Item("ДлинаСтрокиПлательщик").Value = Len(CStr(Split(strLine, "=")(1)))
						Case "НазначениеПлатежа"
							.Fields.Item("НазначениеПлатежа").Value = CStr(Split(strLine, "=")(1))
							.Fields.Item("ДлинаСтрокиНазначениеПлатежа").Value = Len(CStr(Split(strLine, "=")(1)))
						'Case "ДатаСписано"
						'	If IsDate(Split(strLine, "=")(1)) Then
						'		.Fields.Item("Сумма").Value = - .Fields.Item("Сумма").Value
						'	End If
					End Select
				Loop
				objTS.Close
				.Sort = "Номер DESC" : .MoveFirst
				intNumberMaxLength = Len(.Fields.Item("Номер").Value)
				.Sort = "ДлинаСтрокиСумма DESC" : .MoveFirst
				intSummMaxLength   = .Fields.Item("ДлинаСтрокиСумма").Value
				.Sort = "ДлинаСтрокиПлательщик DESC" : .MoveFirst
				intPlatMaxLength   = .Fields.Item("ДлинаСтрокиПлательщик").Value
				.Sort = "ДлинаСтрокиНазначениеПлатежа DESC" : .MoveFirst
				intNazPlatMaxLength   = .Fields.Item("ДлинаСтрокиНазначениеПлатежа").Value
				.Sort = "" : .MoveFirst
				Do Until .EOF
					With .Fields
						WScript.StdOut.Write Left(CStr(.Item("ДатаСписано").Value) & Space(10), 10) & vbTab				
						WScript.StdOut.Write Left(CStr(.Item("ДатаПоступило").Value) & Space(10), 10) & vbTab
						WScript.StdOut.Write Right(Space(intNumberMaxLength) & CStr(.Item("Номер").Value), intNumberMaxLength) & vbTab
						WScript.StdOut.Write Right(Space(intSummMaxLength) & FormatCurrency(.Item("Сумма").Value, 2), intSummMaxLength) & vbTab
						WScript.StdOut.Write Left(CStr(.Item("Плательщик").Value) & Space(intPlatMaxLength), intPlatMaxLength) & vbTab
						WScript.StdOut.Write Left(CStr(.Item("НазначениеПлатежа").Value) & Space(intNazPlatMaxLength), intNazPlatMaxLength)
						WScript.StdOut.WriteLine
					End With
					.MoveNext
				Loop
				.Close
			End With
			Set objTS = Nothing
			lngErrCode = 0
		Else
			WScript.StdErr.WriteLine "File [" & strSourceFile & "] not found"
			lngErrCode = 2
		End If
	End With
Else
	WScript.StdErr.WriteLine "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ """""
	lngErrCode = 1
End If
WScript.Quit lngErrCode





Так ДатаСписано и ДатаПоступило - это 2 колонки, не знаю, стоит ли делать в одну или оставить так...
Ответить

Вернуться в «Скриптовые языки администрирования Windows»