|
You last visited: Today at 18:48
Advertisement
DateiPatcher
Discussion on DateiPatcher within the AutoIt forum part of the Coders Den category.
11/11/2012, 03:22
|
#1
|
elite*gold: 0
Join Date: Feb 2012
Posts: 1,405
Received Thanks: 2,942
|
DateiPatcher
Hab ein Problem.
Ich will einen Sprachpatcher schreiben, der Zeile für Zeile eine Datei übersetzt.
Er holt sich aus einer datei die übersetzten Variablen, und überschreibt nach und nach die der originalen datei.
Allerdings geht mir das ganze zu langsam.
Ich nutze diese funktion zum bekommen der zeile eines strings.
PHP Code:
Func _LineNumsOfSearchStr($sFileName, $searchString, $bDeleteLine = False)
Local $location, $aCurrentLineNum, $iCurrentLineNum, $sFile, $iOccur = 1, $sRes = ""
If FileExists($sFileName) = 0 Then Return 1
Do
$sFile = FileRead($sFileName)
$location = StringInStr($sFile, $searchString, 0, $iOccur)
If $location > 0 Then
$aCurrentLineNum = StringRegExp(StringRegExpReplace($sFile, "(?s)(.{" & $location & "})(.*)$", "\1"), "(?s)(\v+)", 3)
$iCurrentLineNum = UBound($aCurrentLineNum) + 1
$sRes &= $iCurrentLineNum & "|"
If $bDeleteLine Then
_FileWriteToLine($sFileName, $iCurrentLineNum, "", 1)
Else
$iOccur += 1
EndIf
Else
ExitLoop
EndIf
Sleep(10)
Until 0
$result = StringSplit(StringTrimRight($sRes, 1), "|")
Return $result[1]
EndFunc
Diese funktion braucht durchschnittlich 100 ms pro zeile.
Die datei die ich nutze hat 4761 zeilen.
Habe mir das ganze ausgerechnet und komme auf 7 Minuten.
Und das ist mir viel zu langsam.
Hat jemand einen Plan?
|
|
|
11/11/2012, 08:28
|
#2
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,403
|
Öffne die Datei mit
und schließe sie mit
MfG
|
|
|
11/11/2012, 13:30
|
#3
|
elite*gold: 0
Join Date: Feb 2012
Posts: 1,405
Received Thanks: 2,942
|
Troll wo anders.
Ich habe mir jetzt folgendes gebastelt, und komme auf eine zeit von 1 Minute.
PHP Code:
local $aLines _FileReadToArray("lang.dbo", $aLines)
$time = TimerInit()
for $i = 1 to $aLines[0] _ArraySearch($aLines, $aLines[$i], 0, 0, 0, 1) ToolTip($i, 0,0) Next $timedif = TimerDiff($time) MsgBox(0,"",$timedif)
Geht es vielleicht noch schneller, oder kann man aus autoit nicht mehr rausholen?
|
|
|
11/11/2012, 13:45
|
#4
|
elite*gold: 2
Join Date: Jul 2009
Posts: 14,456
Received Thanks: 4,685
|
Warum "Troll" wo anders? Wenn du file Open nicht nutzt wird die Funktion ohnehin bei jedem Zugriff aufgerufen.
|
|
|
11/11/2012, 14:10
|
#5
|
elite*gold: 0
Join Date: Feb 2012
Posts: 1,405
Received Thanks: 2,942
|
Ach ich seh jetzt was er meint sry.
Ich dachte er will trollen.
Naja aber mit arrays ist es ohnehin schneller als mir fileread etc.
Nur leider nicht schnell genug xD
Das Problem ist, dass manche Zeilen in der datei nicht synchron mit der anderen sind.
Sonst könnte ich einfach die Arrays vergleichen.
PHP Code:
for $i = 1 to $langdbo[0] ProgressSet(100/$langdbo[0]*$i, Round(100/$langdbo[0]*$i)&"%") $tmp1 = _StringBetween(String($langdbo[$i+1]), "", "=") $tmp2 = _StringBetween(String($langpak[$i]), "", "=")
If $tmp1[0] = $tmp2[0] Then $langpak[$i] = $langdbo[$i+1] EndIf ;_ArraySearch($langdbo, $langdbo[$i], 0, 0, 0, 1) Next
Ab der 6. Zeile sind die zeilen nicht mehr synchron.
Wenn ich allerdings einen array "einschieben" könnte und alle anderen arrays dabei nach vorne verschoben werden, würde es gehen.
Kenne allerdings keine funktion dafür.
|
|
|
11/11/2012, 14:22
|
#6
|
elite*gold: 528
Join Date: Jan 2012
Posts: 2,127
Received Thanks: 2,403
|
Quote:
Originally Posted by Crack-wtf
Ich will einen Sprachpatcher schreiben, der Zeile für Zeile eine Datei übersetzt.
PHP Code:
Func _LineNumsOfSearchStr($sFileName, $searchString, $bDeleteLine = False)
Local $location, $aCurrentLineNum, $iCurrentLineNum, $sFile, $iOccur = 1, $sRes = ""
If FileExists($sFileName) = 0 Then Return 1
Do
$sFile = FileRead($sFileName)
$location = StringInStr($sFile, $searchString, 0, $iOccur)
If $location > 0 Then
$aCurrentLineNum = StringRegExp(StringRegExpReplace($sFile, "(?s)(.{" & $location & "})(.*)$", "\1"), "(?s)(\v+)", 3)
$iCurrentLineNum = UBound($aCurrentLineNum) + 1
$sRes &= $iCurrentLineNum & "|"
If $bDeleteLine Then
_FileWriteToLine($sFileName, $iCurrentLineNum, "", 1)
Else
$iOccur += 1
EndIf
Else
ExitLoop
EndIf
Sleep(10)
Until 0
$result = StringSplit(StringTrimRight($sRes, 1), "|")
Return $result[1]
EndFunc
Und das ist mir viel zu langsam.
|
Einzelne Zeilen bekommst du mit
Code:
StringSplit($sString,Chr(13),2)
Von andauernden FileWrites ohne Handle in einer Schleife kann ich dir nur abraten, das ist nämlich sehr langsam. Du könntest am Ende ein mal ein Filewrite machen.
Quote:
Originally Posted by Crack-wtf
Naja aber mit arrays ist es ohnehin schneller als mir fileread etc.
Nur leider nicht schnell genug xD
Das Problem ist, dass manche Zeilen in der datei nicht synchron mit der anderen sind.
Sonst könnte ich einfach die Arrays vergleichen.
PHP Code:
for $i = 1 to $langdbo[0]
ProgressSet(100/$langdbo[0]*$i, Round(100/$langdbo[0]*$i)&"%")
$tmp1 = _StringBetween(String($langdbo[$i+1]), "", "=")
$tmp2 = _StringBetween(String($langpak[$i]), "", "=")
If $tmp1[0] = $tmp2[0] Then
$langpak[$i] = $langdbo[$i+1]
EndIf
;_ArraySearch($langdbo, $langdbo[$i], 0, 0, 0, 1)
Next
Ab der 6. Zeile sind die zeilen nicht mehr synchron.
|
Was bedeuten denn deine Variablen? Wo ist da jetzt deine Datei, die du einlesen willst?
MfG
|
|
|
All times are GMT +1. The time now is 18:48.
|
|