1 (изменено: 2vv, 2011-09-13 13:44:34)

Тема: VBS: Подстановка значений из одного тектового файла в другой

Добрый день.
Возможно-ли решить следующую задачку средствами VBS.?
Есть два текстовых (csv) файла следующего содержания:
File1 (список)
105;Petrov
106;Ivanov
107;Sidorov

File2 (в него надо подставлять значения из File1)
105;;ingener
107;;manager

File1 - список всех значений. File2 - некая выборка. Нужно в File2 заполнить пустые "ячейки" на основании File1. На выходе нужно получить
File3 с содержимым типа:

File3
105;Petrov;ingener
107;Sidorov;manager.

Это можно сделать в excel , но хотелось бы скриптом.

Спасибо.

2

Re: VBS: Подстановка значений из одного тектового файла в другой

2vv пишет:

Добрый день.
Возможно-ли решить следующую задачку средствами VBS.?
Спасибо.

Ответ: возможно
Пользуясь поиском по форуму можно обнаружить как читать - писать текстовые файлы. А как сравнивать строковые данные это и без форума понятно.

Автоматизирую торговлю. Не 1С

3

Re: VBS: Подстановка значений из одного тектового файла в другой

Должно работать!

Dim FSO
Dim file1
Dim file3
Dim Txt1
Dim Txt3
Dim N

Set FSO=CreateObject("Scripting.FileSystemObject") 'подключаем filesystemobject
Set file1 = FSO.OpenTextFile("C:\File1.csv", 1, False) 'открыть только для чтения
Set file3 = FSO.CreateTextFile("C:\File3.csv")'Создаем текстовый файл

Do While File1.AtEndOfStream <> True
    Txt1 = File1.ReadLine
    N = Mid(txt1,1,3)
    Call Search(N, Txt3)
Loop
file1.Close
file3.Close
MsgBox "Ok!"
WScript.Quit

Sub Search(N, Txt3)
    Dim file2
    Dim Txt2
    Dim TxtX
    Set file2 = FSO.OpenTextFile("C:\File2.csv", 1, False) 'открыть только для чтения
    Do While File2.AtEndOfStream <> True
        Txt2 = File2.ReadLine
        
        If InStr(Txt2, N ) > 0 Then
            TxtX = Right(Txt2,Len(Txt2) - 4)
            Txt3 = Txt1 & TxtX
            Exit Do
        Else
            Txt3 = Txt1
        End If
    Loop
    file3.WriteLine(Txt3)
    file2.Close
End Sub

4

Re: VBS: Подстановка значений из одного тектового файла в другой

Mickey666x
Спасибо. Работает частично. Надо чуть чуть поправить.  На выходе почему-то получается такое:
105;;ingener05;petrov
107;;manager05;petrov

5

Re: VBS: Подстановка значений из одного тектового файла в другой

Во первых. Ты файлы местами наверное поменял (То есть в первом файле должны быть фамилии, во втором должности); во вторых этот скрипт написал для 3-х значных порядковых номеров. У меня все отлично получается! Если есть необходимость могу еще посидеть и сделать для любых порядковых номеров.

6

Re: VBS: Подстановка значений из одного тектового файла в другой

БОльшое спасибо.
Да, там не всегда трехзначные номера. Может быть и 4 цифры и буквы. Но символов не более 6-ти.

7

Re: VBS: Подстановка значений из одного тектового файла в другой

2vv, сколько примерно строк в обоих файлах? Покажите реальные куски файлов: нужно увидеть всю структуру CSV.

8 (изменено: Mickey666x, 2011-09-14 19:57:25)

Re: VBS: Подстановка значений из одного тектового файла в другой

Пробуй!

Dim FSO
Dim file1
Dim file3
Dim Txt1
Dim Txt3
Dim N
Dim Z

Set FSO=CreateObject("Scripting.FileSystemObject") 'подключаем filesystemobject
Set file1 = FSO.OpenTextFile("C:\File1.csv", 1, False) 'открыть только для чтения
Set file3 = FSO.CreateTextFile("C:\File3.csv")'Создаем текстовый файл
Z = 0
Do While File1.AtEndOfStream <> True
    Txt1 = File1.ReadLine
    Call Num(N, Txt1)
    Call Search(N, Txt3)
    Z = Z + 1
Loop
file1.Close
file3.Close
MsgBox "Ok! Создано " & Z & " cтрок."
WScript.Quit

Sub Search(N, Txt3)
    Dim file2
    Dim Txt2
    Dim TxtX
    Set file2 = FSO.OpenTextFile("C:\File2.csv", 1, False) 'открыть только для чтения
    Do While File2.AtEndOfStream <> True
        Txt2 = File2.ReadLine
        If InStr(Txt2, N ) > 0 Then
            TxtX = Right(Txt2,Len(Txt2) - Len(N) - 1)
            Txt3 = Txt1 & TxtX
            Exit Do
        Else
            Txt3 = Txt1
        End If
    Loop
    file3.WriteLine(Txt3)
    file2.Close
End Sub

Sub Num(N, Txt1)
    Dim X
    Dim Y
    N = ""
    X = 0
    Do
        X = X + 1
        Y = Mid (Txt1, X, 1)
        If Y = ";" Then
            Exit Sub
        Else
            N = N & Y
        End If
    Loop Until Len(Txt1) = X
End Sub

Если что обращайся!

9 (изменено: 2vv, 2011-09-18 16:17:17)

Re: VBS: Подстановка значений из одного тектового файла в другой

Mickey666x
  Извиняюсь, но что-то не так. Вот содержимое file3:
105;Petrov;ingener
106;Ivanov;manager
107;Sidorov

alexii
Структура такая  и есть.Количество строк в file1(список) - около сотни. Количество строк в File2 - значительно больше и выглядеть он может так:
105;;XX
105;;XX
105;;XX
107;;XX
110;;XX
108;;XX
108;;XX
110;;XX

XX - Любое слово или строка.
Нужно после первого значения , например 105, поставить соответствующее слово из file1.
И еще, в принципе необязательно создавать третий файл, можно производить изменение во втором (на основании первого) .

10

Re: VBS: Подстановка значений из одного тектового файла в другой

2vv пишет:

105;;XX
105;;XX
105;;XX
107;;XX
110;;XX
108;;XX
108;;XX
110;;XX

Как я понял данные с первого столбика могут повторятся... Не очень ясная задача. Скрипт ведь должен за чтото зацепиться.

2vv пишет:

И еще, в принципе необязательно создавать третий файл, можно производить изменение во втором (на основании первого).

3 файл необходимо создавать, т. к. файл либо открывается для чтения (писать в нем нельзя), либо для записи (читать нельзя). Как вариант: Создается третий файл, сохраняется, удаляется второй, третий переименовывается.

11

Re: VBS: Подстановка значений из одного тектового файла в другой

Mickey666x пишет:

Не очень ясная задача. Скрипт ведь должен за чтото зацепиться.

Цепляйтесь за все совпадения.

2vv пишет:

Количество строк в File2 - значительно больше

«значительно больше» — это сколько?

Option Explicit

' IOMode Enum
Const ForReading   = 1
Const ForWriting   = 2


Dim objTSDest

Dim strFileSourceIn
Dim strFileSourceOut
Dim strFileDest
Dim strBAKFileSourceOut

Dim arrValues
Dim objDictionary


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

strFileSourceIn = "E:\Песочница\0073\FileSourceIn.txt"
strFileSourceOut = "E:\Песочница\0073\FileSourceOut.txt"

strFileDest = GetTemporaryName()

With WScript.CreateObject("Scripting.FileSystemObject")
    With .OpenTextFile(strFileSourceIn, ForReading)
        Do Until .AtEndOfStream
            arrValues = Split(.ReadLine, ";")
            objDictionary.Add arrValues(0), arrValues(1)
        Loop
        
        .Close
    End With
    
    Set objTSDest = .CreateTextFile(strFileDest)
    
    With .OpenTextFile(strFileSourceOut, ForReading)
        Do Until .AtEndOfStream
            arrValues = Split(.ReadLine, ";")
            
            If objDictionary.Exists(arrValues(0)) Then
                arrValues(1) = objDictionary(arrValues(0))
            End If
            
            objTSDest.WriteLine Join(arrValues, ";")
        Loop
        
        .Close
    End With
    
    objTSDest.Close
    
    strBAKFileSourceOut = .BuildPath(.GetParentFolderName(.GetAbsolutePathName(strFileSourceOut)), .GetBaseName(strFileSourceOut) & ".bak")
    
    If .FileExists(strBAKFileSourceOut) Then
        .DeleteFile strBAKFileSourceOut, True
    End If
    
    .MoveFile strFileSourceOut, strBAKFileSourceOut
    .CopyFile strFileDest, strFileSourceOut, True
    .DeleteFile strFileDest, True
End With

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetTemporaryName()
    Const TemporaryFolder = 2
    
    Dim strTempName
    
    With WScript.CreateObject("Scripting.FileSystemObject")
        Do
            strTempName = .BuildPath(.GetSpecialFolder(TemporaryFolder), .GetTempName)
        Loop While .FileExists(strTempName) Or .FolderExists(strTempName)
    End With
    
    GetTemporaryName = strTempName
End Function
'=============================================================================

Поддержку передачи имён входных/выходных файлов посредством аргументов командной строки оставляю на Вашу проработку.

12

Re: VBS: Подстановка значений из одного тектового файла в другой

alexii Работает хорошо. Спасибо. Теперь бы разобраться как он работает.

Всем спасибо за помощь.!

13

Re: VBS: Подстановка значений из одного тектового файла в другой

2vv пишет:

Теперь бы разобраться как он работает.

Что непонятно — спрашивайте.

14

Re: VBS: Подстановка значений из одного тектового файла в другой

Алгоритм не очень ясен.

15

Re: VBS: Подстановка значений из одного тектового файла в другой

Из первого файла-источника построчно читаем текст. Каждую прочитанную строку разбиваем по разделителю «;» и заносим полученные части в массив. Тут же заносим эти данные в коллекцию: первый элемент массива (часть прочитанной строки до разделителя «;») — ключ, идентификатор, уникальное значение, однозначно определяющее данный элемент коллекции среди прочих, и второй элемент массива (часть прочитанной строки после разделителя «;») — значение этого элемента коллекции.

Из второго файла-источника построчно читаем текст. Каждую прочитанную строку разбиваем по разделителю «;» и заносим полученные части в массив. Затем проверяем: если в коллекции существует элемент с таким же ключом, как у первого элемента массива (часть прочитанной строки до первого разделителя «;»), то заменяем второй элемент массива (часть прочитанной строки после первого и до второго разделителей «;») на значение элемента коллекции. Полученный массив сливаем в строку, которую пишем в результирующий файл.

16

Re: VBS: Подстановка значений из одного тектового файла в другой

Спасибо. Профессионально.