2015-02-13 1 views
1

Я новичок и искал способ в скрипте vb сделать следующее: У меня есть несколько текстов файлы в определенной папке (C: \ data), я хочу прокрутить все текстовые файлы, удалить первую и последнюю строку каждого текстового файла, а затем объединить/объединить все файлы в один текстовый файл. Ваша помощь очень ценится. Заранее спасибо.VBscript: Прокрутите все текстовые файлы в папке, удалите первую и последнюю строку каждого файла и объединитесь в один файл.

Вот что я написал до сих пор после нескольких часов чтения/поиска в Интернете (но это заканчивается бесконечный цикл):

Const ForReading = 1 

Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set folder = objFSO.GetFolder("C:\data\") 
Set outFile = objFSO.CreateTextFile("C:\data\out\testout.txt") 

for each file in folder.Files 

if lcase(objFSO.getExtensionName(file.path))="txt" then 

Set testfile = objFSO.OpenTextFile(file.path, ForReading) 


Do Until testfile.AtEndOfStream 
    If testfile.Line <= 1 Then 
    testfile.SkipLine 
    Else 
    if Not IsEmpty(line) Then outFile.WriteLine(line) 
    line = testfile.ReadLine 
    End If 
Loop 

testfile.Close 

End If 

next 

outFile.Close 

ответ

1

Всегда используйте option explicit заявление. Это помогает выявлять ошибки в синтаксисе и в логике.

Вот некоторые усовершенствования кода подсказки:

  • Привлекайте счетчик строк (см linecount).
  • IsEmpty Функция возвращает логическое значение, указывающее, была ли инициализирована переменная. Возможно, вы имели в виду empty string?
  • Запишите и подумайте о line = "" заявлениях.

Однако следующий фрагмент кода может работать. Но может работать так, как ожидалось?

Set testfile = objFSO.OpenTextFile(file.path, ForReading) 
line = "" 
linecount = 1   ' or 0 ? 
Do Until testfile.AtEndOfStream 
    If linecount <= 1 Then 
    testfile.SkipLine 
    line = "" 
    Else 
    if Not Trim(line) = "" Then outFile.WriteLine(line) 
    line = testfile.ReadLine 
    End If 
    linecount = linecount +1 
Loop 
testfile.Close 

Редактировать в соответствии с комментарием Ekkehard.Horner в (спасибо):

  • он прав с 5 колесо :),
  • он прав с 1-й линии пропуском,
  • Последняя строка не будет записана, потому что .ReadLineУспешно завершает работу.

Таким образом, фрагмент кода может выглядеть следующим образом:

Set testfile = objFSO.OpenTextFile(file.path, ForReading) 
line = "" 
if not testfile.AtEndOfStream then testfile.SkipLine 
Do Until testfile.AtEndOfStream 
    if Not Trim(line) = "" Then outFile.WriteLine(line) 
    line = testfile.ReadLine 
Loop 
testfile.Close 

Edit2: сохранить пустые строки

Set testfile = objFSO.OpenTextFile(file.path, ForReading) 

set line=Nothing 

if not testfile.AtEndOfStream then testfile.SkipLine 
Do Until testfile.AtEndOfStream 
    if Not IsObject(line) Then outFile.WriteLine(line) 
    line = testfile.ReadLine 
Loop 
testfile.Close 

Отредактировано согласно this Ekkehard.Horner's comment

+0

Текстовый поток ** имеет ** счетчик строк (.Line), поэтому linecount - это пятое колесо; первая строка должна быть пропущена ** перед ** петлей; та же стратегия, что и не писать последнюю строку. –

+0

'if Not Trim (line) =" "Then outFile.WriteLine (строка)' по-прежнему является if (и trim()) ** в цикле, которого следует избегать, тем более, что он удаляет пустые строки между первый и последний (не в спецификациях). BTW: использование tspe's IsEmpty() полностью корректно. –

+0

@ Ekkehard.Horner Ad 'IsEmpty()': правильный _as такой_, но для первого файла только в цикле 'for each'.Начиная второй файл приводит к 'false', поэтому последняя строка предыдущего файла будет записана для вывода. Ad_empty lines_: «решено» давно с _unlike string_ (cf. edit2), но теперь я вижу лучшее решение: 'set line = Nothing' вместо' line = unlikestring' и test 'if Not IsObject (line) Then' вместо из 'if Not line = unlikestring then' – JosefZ

0

То, что я не мог положил в комментарий:

type 28507073.vbs 
Option Explicit 

Dim tsIn : Set tsIn = CreateObject("Scripting.FileSystemObject").OpenTextFile(".\28507073.txt") 
If tsIn.AtEndOfStream Then 
    WScript.Echo "Empty file" 
Else 
    tsIn.SkipLine 
    If Not tsIn.AtEndOfStream Then 
     Dim s : s = tsIn.ReadLine() 
     Do Until tsIn.AtEndOfStream 
     WScript.Echo s 
     s = tsIn.ReadLine() 
     Loop 
    End If 
End If 
tsIn.Close 

type 28507073.txt 
1 
2 
3 
4 

cscript 28507073.vbs 
2 
3 
Смежные вопросы