-1

Мне нужно переместить ряд файлов в зависимости от их содержания. В идеале это может быть вызвано изнутри Excel, так как пользователь импортирует файлы. Я могу сделать это с помощью простого сценария оболочки Unix следующим образом:

#!/bin/bash
for F in $(ls *.csv)
  do  
   while read N W
   do
     if grep -q "$W" "$F"
     then
      NEW=${N:0:50}.csv
        echo $F $NEW
        cp "$F" WORKING/$NEW
        break
      fi
  done <  ../Documents/ASSET\ Sale/bin/fixfilenames_namemap.txt
done

cp Name*.csv WORKING/name_name2.csv

Формат файла fixfilesnames_namemap.txt:

newfilename text search string
newfilename2 text search string number two

Обратите внимание, что последняя строка представляет собой kludge, так как этот файл имеет несколько пробелов в имени, и поэтому он не может быть правильно вызван в цикле, поэтому я просто перемещаю один файл.

Мне бы хотелось, чтобы выполнялась подпрограмма VBA или, возможно, простой файл .bat, который я мог бы запускать из Excel 2016.

В настоящее время я работаю с функцией RenameFile(), которая позволяет мне указывать каталог, источник и новое имя. Если бы я мог просто заставить функцию поиска работать, чтобы найти текстовую строку в другом поле, я бы все сделал.

Public Function RenameFile()
Dim src As String, dst As String, fl As String
Dim rfl As String

'Folder
src = Range("F4")
'File name
fl = Range("G4")
'Rename file
rfl = Range("Assets_Eligible_Destination")

On Error Resume Next
Name src & "\" & fl As src & "\" & rfl
If Err.Number <> 0 Then
    MsgBox "Error: " & src & "\" & rfl
End If
On Error GoTo 0
End Function

Спасибо

1 ответ1

0

Следующий код работает, чтобы найти строку из листа в наборе файлов. Однако это очень медленно, если ваши файлы имеют длину 100 Кб, а совпадающая строка - в последних 10.

Это основано на другом ответе StackOverflow: как найти конкретную строку в одном из множества текстовых файлов .log, используя VBA?

Sub StringExistsInFile()
  Dim theString As String
  Dim path As String
  Dim StrFile As String
  Dim fso As New FileSystemObject
  Dim file As TextStream
  Dim line As String

  theString = Range("E4")
  path = Range("F4")
  StrFile = Dir(path & "*.csv")

  Do While StrFile <> ""

    'Find TheString in the file
    'If found, debug.print and exit loop

    'Set file = fso.OpenTextFile(path & StrFile)


    Do While Not file.AtEndOfStream
        line = file.ReadLine

'Debug.Print line

        If InStr(1, line, theString, vbTextCompare) > 0 Then
            Range("G4").Value = StrFile
            Exit Do
        End If
    Loop

    file.Close
    Set file = Nothing
    Set fso = Nothing

    StrFile = Dir()
  Loop
End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .