Avatar billede hurra Novice
14. april 2009 - 13:17 Der er 2 kommentarer og
1 løsning

Ruby: Parse tags fra fil til liste

Hej folkens

Jeg skal ha lavet et lille script til at finde nogle bestemte tags fra noget kode. Jeg har så brug for at få lavet en liste af de tags jeg har fundet. Listen skal bruges til en enum i min kode. Alt sammen er jo meget let, men der er et lille problem, og så kunne jeg godt tænke mig at få nogle generelle gode råd.

Nedenstående er en stærkt simplificeret version af mit script:
def EnumName(str)
    return "TAGNAME_#{str.gsub(/[\s\%\"\#\(\)\{\}\\\/\&\[\]]/, '_')}"
end

def ParseFile(filename)
    fh = File.new(filename, 'r')
    fh.each {
        |line|
        a = line.scan(/\<(.+?)\>/)[0]
        if a != nil
            outfile.puts "  #{EnumName(a[0])},"
        end
    }
end

outfile.puts "enum {"
    Dir["*/*.cpp"].each{
        |filename|
        ParseFile(filename)
    }
outfile.puts "};"

Problemet er nu at listen kommer til at slutte med et komma. Hvordan løsr jeg dette smartest? Umidlbart ville jeg nok helt undlade at skrive kommaet ud i første omgang, og så bare skrive det når jeg finder den næste linie. Er det en god ide, eller er der andet der er smartere?
Avatar billede jih Nybegynder
14. april 2009 - 14:17 #1
Nu ved jeg ikke så meget om ruby, men jeg kender til problemet.
Jeg plejer at løse det ved at skrive alt ind i en variabel først, og så fjerne det sidste komma vha. en substr funktion.

fx: tmpA = substr(tmpA, 1, len(tmpA - 1))
Avatar billede hurra Novice
14. april 2009 - 17:11 #2
Jeg sætter nu selv kommaet, så det er ikke det at komme af med kommaer, sådan generelt set. Det er kun det sidste komme der ikke må være der.

Jeg tror nu planen bliver at jeg gemmer stringen der skal bruges i en variabel. Når jeg finder et nyt tag, skriver jeg den gamle ud med komma efter, og gemmer den nye string i valiablen. Til sidst, lige efter loopet, skriver jeg så indholdet af variablen ud, uden komma efter.

Jeg tror ikke det kan gøres mere effektivt end det, men jeg vil gerne høre fra jeg hvis der er noget der er smartere.
Avatar billede hurra Novice
14. april 2009 - 17:15 #3
Sådan noget i stil med det her:
def EnumName(str)
    return "TAGNAME_#{str.gsub(/[\s\%\"\#\(\)\{\}\\\/\&\[\]]/, '_')}"
end

@nextLine= nil

def ParseFile(filename)
    fh = File.new(filename, 'r')
    fh.each {
        |line|
        a = line.scan(/\<(.+?)\>/)[0]
        if a != nil
            if(@nextLine != nil)
                puts "  #{@nextLine},    "
            end
            @nextLine = EnumName(a[0])
        end
    }
end

puts "enum {"
    Dir["**/*.cpp"].each{
        |filename|
        ParseFile(filename)
    }
    puts "  #{@nextLine}"
puts "};"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester