Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

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

Новый участник


Сообщения: 30
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день!
Нужна помощь: есть файл Kl_to_1c.txt примерно такого содержания:
читать дальше »
1CClientBankExchange
ВерсияФормата=1,01
Кодировка=Windows
Получатель=1Cv77
ДатаСоздания=21.08.2012
ВремяСоздания=15:03:30
ДатаНачала=20.08.2012
ДатаКонца=21.08.2012
РасчСчет=77777777777777777777
СекцияДокумент=Платежное поручение
Дата=20.08.2012
Номер=1339
Сумма=146
ПлательщикСчет=12345678901234567890
ПолучательСчет=09876543210987654321
ПлательщикИНН=1234567890
Плательщик1=Филиал ОАО "Иркутскэнерго"
ПлательщикБИК=042520607
ПлательщикБанк1=БАЙКАЛЬСКИЙ БАНК СБЕРБАНКА РОССИИ Г.ИРКУТСК
ПолучательИНН=0987654321
Получатель1=ИП Иванов Иван Иванович
ПолучательБИК=042520607
ПолучательБанк1=БАЙКАЛЬСКИЙ БАНК СБЕРБАНКА РОССИИ Г.ИРКУТСК
НазначениеПлатежа=Оплата счета №10 от 20.08.2012г. Без налога (НДС)
СтатусСоставителя=
ПлательщикКПП=222222222
ПолучательКПП=
ПоказательКБК=
ОКАТО=
ПоказательОснования=
ПоказательПериода=
ПоказательНомера=
ПоказательДаты=
ПоказательТипа=
ВидОплаты=1
ДатаПоступило=20.08.2012
КонецДокумента

Необходимо получить файл с таким содержимым:
читать дальше »
20.08.2012 - 1339 - 146 - Филиал ОАО "Иркутскэнерго"

Т. е. формат типа: %Дата=% - %Номер=% - %Сумма=% - %Плательщик1=%
Спасайте.

Отправлено: 10:17, 21-08-2012

 

Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


TRaMeLL, в новом файле отсутствуют записи вида:
Цитата TRaMeLL:
Код: Выделить весь код
Дата=…
»
Так что, начните с формулировки новых требований: что, как, откуда…

Отправлено: 12:13, 26-09-2012 | #21



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 30
Благодарности: 0

Профиль | Отправить PM | Цитировать


Почему отсутствуют? Там просто вначале документа не нужная информация, потом идет так (кусок из того же файла):
читать дальше »
СекцияДокумент=Платежное поручение
Номер=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, |без налога (НДС).|
КонецДокумента

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

Последний раз редактировалось TRaMeLL, 26-09-2012 в 12:58.


Отправлено: 12:46, 26-09-2012 | #22


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Пробуйте:
читать дальше »
Код: Выделить весь код
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 & """ ""<Source file>"""
	lngErrCode = 1
End If

WScript.Quit lngErrCode

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

Отправлено: 14:08, 26-09-2012 | #23


Новый участник


Сообщения: 30
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ага, десятичные опять не совпадают, раскоменнтировал строки. Работает как надо. Спасибо огромное, вы мне снова жизнь спасли.

Отправлено: 14:21, 26-09-2012 | #24


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата TRaMeLL:
Спасибо огромное, »
Рад был помочь.

Цитата TRaMeLL:
вы мне снова жизнь спасли. »
Да, нет, это вряд ли .

Отправлено: 14:32, 26-09-2012 | #25


Новый участник


Сообщения: 30
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:51, 02-10-2012 | #26


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


Цитата TRaMeLL:
В новом формате исходного файла… »
Где пример файла?

Отправлено: 19:20, 02-10-2012 | #27


Новый участник


Сообщения: 30
Благодарности: 0

Профиль | Отправить PM | Цитировать


Отправил в PM.

Отправлено: 05:17, 03-10-2012 | #28


Ветеран


Сообщения: 27449
Благодарности: 8088

Профиль | Отправить PM | Цитировать


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 & """ ""<Source file>"""
	lngErrCode = 1
End If

WScript.Quit lngErrCode

Замечание:
Цитата Iska:
Если опять формат десятичных разделителей в файле и на машине не совпадает — раскомментируйте SetLocale'ы. »
остаётся в силе.

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

Отправлено: 18:57, 08-10-2012 | #29


Новый участник


Сообщения: 30
Благодарности: 0

Профиль | Отправить PM | Цитировать


Спасибо! С определением, похоже, проблем нет. Немного переделал скрипт, конечный вид:
читать дальше »
Код: Выделить весь код
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 & """ ""<Source file>"""
	lngErrCode = 1
End If

WScript.Quit lngErrCode

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

Последний раз редактировалось TRaMeLL, 11-10-2012 в 13:44.


Отправлено: 13:40, 09-10-2012 | #30



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Экспорт данных из одного txt файла в другой

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
PowerShell - [решено] Поиск и вставка информации из одного csv-файла в другой IvanXXL Скриптовые языки администрирования Windows 1 20-07-2011 12:48
[решено] Передача данных с одного ПК на другой Cjing Хочу все знать 7 25-04-2010 23:44
Проблема с копированием данных с одного харда на другой 3Darking Непонятные проблемы с Железом 9 01-04-2009 15:00
Разное - Преобразование одного формата файла в другой Evgesha_572 Программирование и базы данных 3 04-02-2009 14:57
Как экспортировать поле из одного dbf файла в другой? Raman Программное обеспечение Windows 1 04-04-2008 14:30




 
Переход