NoPaste

contest_heisenberg_lua_long

von heisenberg
SNIPPET_DESC:
Scripting Contest 08_2015 heisenberg / lua-lang
SNIPPET_CREATION_TIME:
23.09.2015 22:48:36
SNIPPET_PRUNE_TIME:
Unendlich

SNIPPET_TEXT:
  1. #!/usr/bin/env lua
  2.  
  3. --
  4. --      LUA - der prozedurale Ansatz - erweitert auch als ein Einblick in
  5. --            die Methode der LUA-Iteratoren
  6. --
  7. --            Diese Variante kann mit beliebigen Datenmengen umgehen
  8. --
  9.  
  10. -- Keine tr Funktion in lua. Also schnell mal eine schreiben...
  11. function tr(string,search,replace)
  12.         local tmp = ""
  13.         string:gsub("(.)", function(char)
  14.                         pos = search:find(char,1,true)
  15.                         tmp=tmp..(pos and replace:sub(pos,pos) or char)
  16.                         end)
  17.         return(tmp)
  18. end
  19.  
  20. -- Eine Iterator-Funktion, die uns zeichenweise den Text zurückliefert...
  21. function chars(text)
  22.         local i = 0
  23.         return function()
  24.                 i = i + 1
  25.                 if ( i <= text:len() ) then return text:sub(i,i) end
  26.                 end
  27. end
  28.  
  29. -- Noch eine Iterator-Funktion, die uns jeweils einen Puffer voll Daten holt...
  30.  
  31. -- Zeichenweise lesen sorgt bei grossen Datenmengen fuer sehr langsame
  32. -- Verarbeitungsgeschwindigkeit. Deswegen lieber einen grossen Schwung
  33. -- Daten lesen.
  34.  
  35. function buffered_read(filename,buffer_size)
  36.         local file = io.open(filename,"r")
  37.         return function()
  38.                 buffer = file:read(buffer_size)
  39.                 if (buffer) then return buffer end
  40.                 file:close() end
  41. end
  42.  
  43.  
  44. function replace(buffer)
  45.         local tmp=""
  46.         for char in chars(buffer) do
  47.  
  48.                 -- XOR: nur wenn " erkannt oder(exclusiv) in_quote auf true steht
  49.                 -- sind wir weiterhin in_quote
  50.                 in_quote=(char=='"' or in_quote) and (char~='"' or not in_quote)
  51.  
  52.                 char=(( not in_quote ) and tr(char,"abeg","4836") or char)
  53.                 tmp=tmp..char
  54.         end
  55.         return tmp
  56. end
  57.  
  58. -- *************** PROGRAMM STARTET HIER ********************
  59.  
  60. for buffer in buffered_read("textfile.txt",10240) do
  61.         io.stdout:write(replace(buffer))
  62. end

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN