Войти

Показать полную графическую версию : [решено] Построчное чтение "большого" файла и замена символов


phenoMANon
22-08-2013, 13:11
Доброго времени суток!

Прошу помощи при решении следующего вопроса!
Имеется файл размером около 600 Мегабайт, каждый день он обновляется и в нём требуется выполнять следующий преобразования:
1) Удалить все строки которые начинаются с "ФИО"
2) Выполнить ряд последовательных замен:
заменить ;" на "
заменить ; на -
заменить " =" на ;
удалить ="
удалить "

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

Iska
22-08-2013, 13:26
каждый день он обновляется »
Он при этом дописывается или полностью заменяется на новый?

Приведите пример файла (разумеется, не на все 600 Мб, а на несколько килобайт из него — упакуйте в архив и прикрепите архив к сообщению; либо выложите на RGhost, а ссылку — сюда).

phenoMANon
22-08-2013, 13:30
Он при этом дописывается или полностью заменяется на новый? »

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

Iska
22-08-2013, 13:58
phenoMANon, ясно. Тогда ждём образец файла для обработки, в котором было бы всё указанное для замены:
1) Удалить все строки которые начинаются с "ФИО"
2) Выполнить ряд последовательных замен:
заменить ;" на "
заменить ; на -
заменить " =" на ;
удалить ="
удалить " »

phenoMANon
23-08-2013, 06:00
Прикладываю два архива, первый Исходный - пример того, над чем требуется производить преобразования, второй Результат - это то что примерно должно быть в итоге (обрабатываю вручную в FAR). Файлы в формате .csv но прекрасно читаются как текст в любом текстовом редакторе, будь то хоть блокнот, хоть FAR.
103179

103180

Iska
23-08-2013, 09:30
Примерно так:
Option Explicit

Dim strSourceFile
Dim strTempFile
Dim strBakFile

Dim objFSO
Dim objTS

Dim strLine


If WScript.Arguments.Count = 1 Then
strSourceFile = WScript.Arguments.Item(0)

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FileExists(strSourceFile) Then
strTempFile = GetTempName()

Set objTS = objFSO.CreateTextFile(strTempFile)

With objFSO.OpenTextFile(strSourceFile)
Do Until .AtEndOfStream
strLine = .ReadLine()

If Not Left(strLine, Len("""ФИО""")) = """ФИО""" Then
strLine = Replace(strLine, ";""", """")
strLine = Replace(strLine, ";", "-")
strLine = Replace(strLine, """ =""", ";")
strLine = Replace(strLine, """ ", "")
strLine = Replace(strLine, "=""", "")
strLine = Replace(strLine, """", "")

objTS.WriteLine strLine
End If
Loop

.Close
End With

objTS.Close

Set objTS = Nothing

strBakFile = objFSO.BuildPath(objFSO.GetParentFolderName(strSourceFile), objFSO.GetBaseName(strSourceFile) & ".bak")

If objFSO.FileExists(strBakFile) Then
objFSO.DeleteFile strBakFile, True
End If

objFSO.GetFile(strSourceFile).Name = objFSO.GetBaseName(strSourceFile) & ".bak"
objFSO.CopyFile strTempFile, strSourceFile, True
objFSO.DeleteFile strTempFile, True
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
End If
Else
WScript.Echo "Usage: wscript.exe """ & WScript.ScriptFullName & """ <Source file>"
End If

WScript.Quit 0

Function GetTempName()
Dim strTempName

Do
strTempName = objFSO.BuildPath(objFSO.GetSpecialFolder(2), objFSO.GetTempName)
Loop While objFSO.FileExists(strTempName)

GetTempName = strTempName
End Function

phenoMANon
23-08-2013, 10:44
СПАСИБО огромнейшее! Всё работает отлично!




© OSzone.net 2001-2012