Me ajudem em meu algoritmo! [RESOLVIDO]

7 respostas
jomp16

Boa tarde GUJ, antes de dizer, desculpe se eu postei na área errada, mas eu queria a sua ajuda para portar esse algoritmo em C# para Java (ou fazendo um novo algoritmo). Motivos: o programa que eu gostei muito é feito em C#, eu tenho a source code dele, e estou portando para java e melhorando o programa, na minha opinião eu portei 75%

Algoritmo em C#

string[] hofFurniFiles = System.IO.File.ReadAllText(thisDir + "gamedata\\furnidata.txt").Split(new string[] { "[\"", "\"],[\"" }, StringSplitOptions.RemoveEmptyEntries); foreach (string f in hofFurniFiles) { try { string[] parts = f.Split(new string[] { "\"", "\"" }, StringSplitOptions.RemoveEmptyEntries); string FileName = ""; if (parts[4].Contains('*')) FileName = parts[4].Split('*')[0]; else FileName = parts[4]; FileName += ".swf"; downloadFile(SwfData.HofFurni + "/" + parts[6] + "/" + FileName, thisDir + "dcr\\hof_furni\\" + FileName, false); } catch { continue; } }

Para vocês terem uma ideia do furnidata.txt, vejam esse site: http://www.habbo.com.br/gamedata/furnidata

downloadFile é um void que eu já portei, usando o HttpURLConnection, BufferedInputStream e OutputStream.

Caso vocês não entendam o que eu queria, imagine que o programa irá pegar somente isso: " [[“s”,“13”,“shelves_norja”,“39635”,“0”,“1”,“1”,"#ffffff,#F7EBBC",“Estante”,“Para itens decorativos”,"","-1","-1","",“1”], ", eu quero é pegar somente duas partes, que é a “shelves_norja” e “39635” (o que está em negrito), e formar uma URL desse jeito: …/39635/shelves_norja.swf, o resto deixa pra lá, ao achar o " ],[ ", irá comecar o algoritmo de novo, pegando somente a parte que está em negrito, e montando uma URL (while resolve isso).

A parte em negrito não tem nome e números definidos, só é a parte em que eu quero pegar o texto e montar uma URL.

Desde já obrigado. jomp16

7 Respostas

jomp16

Galera, eu consegui mais ou menos o que eu queria

try {
                bf1 = new BufferedReader(new FileReader("DOWNLOADS/" + RELEASE_NAME + "/gamedata/furnidata.txt"));
                //String testea[] = {Pattern.quote("[") + "\"", "\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\""};
                String teste1 = bf1.readLine();
                //String blah = bf1.readLine().replaceAll(Pattern.quote("[") + "\"", "");
                //String blas = blah.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");  //bf1.readLine().replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");
                String teste2 = teste1.replaceAll(Pattern.quote("[") + "\"", "");
                String teste = teste1.replaceAll("\"" + Pattern.quote("]"), "");
                String teste3 = teste.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");
                String teste4[] = teste3.split("\"");
                for (int i = 0; i < teste4.toString().length(); i++) {
                    System.out.println(teste4[3]);
                }
                //while ((teste1 = bf1.readLine()) != null) {
                //String teste2 = teste1.replaceAll(Pattern.quote("[") + "\"", ""); //teste1.split(Pattern.quote("[") + "\"").toString();
                //String teste3 = teste2.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", ""); // teste2.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");
                //String testeg = teste1.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"\n");
                //   String teste4[] = teste1.split("\"");
                //    System.out.println(teste4[5]);
                //}
            } catch (IOException e) {

            }

Mas ele não está percorrendo todo o txt, alguma alma generosa poderia me ajudar nisso? Por favor! Preciso disso!

jomp16

Já desse jeito:

try {
                bf1 = new BufferedReader(new FileReader("DOWNLOADS/" + RELEASE_NAME + "/gamedata/furnidata.txt"));
                //String testea[] = {Pattern.quote("[") + "\"", "\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\""};
                String teste1; // = bf1.readLine();
                //String blah = bf1.readLine().replaceAll(Pattern.quote("[") + "\"", "");
                //String blas = blah.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");  //bf1.readLine().replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");
                //String teste2 = teste1.replaceAll(Pattern.quote("[") + "\"", "");
                //String teste = teste1.replaceAll("\"" + Pattern.quote("]"), "");
                //String teste3 = teste.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");
                //String teste4[] = teste3.split("\"");
                while ((teste1 = bf1.readLine()) != null) {
                    String teste2 = teste1.replaceAll(Pattern.quote("[") + "\"", ""); //teste1.split(Pattern.quote("[") + "\"").toString();
                    String teste3 = teste2.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", ""); // teste2.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "");
                    String testeg = teste1.replaceAll("\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"", "\"" + Pattern.quote("]") + "," + Pattern.quote("[") + "\"\n");
                    String teste4[] = testeg.split("\"");
                    System.out.println(teste4[5]);
                }
            } catch (IOException e) {

            }

Ele NÃO percorre a linha toda, ele após pegar o dado, ele parte para a próxima linha, eu só queria que ele percorresse a linha toda até chegar ao ' "]] ' , aí ele iria mudar para outra linha, entende? Em parte eu consegui o que eu queria, só o problema é o que eu já relatei, ele não lê tudo.

O resultado é:

shelves_norja
table_plasto_square*9
rcandleset
prizetrophy2*1
pillar*8
shelves_norja*8
bed_polyfon*7
divider_nor5
tree1
pura_mdl5*8
summer_pool*1
noob_table*5
noob_rug_tradeable*4
diner_sofa_1*4
svnr_fi
eco_lamp3
ads_calip_parasol
byesw_hotel
val_table1
fball_ptch6
hosptl_cab1
wf_act_toggle_state
bling11_plant
newbie_nest
race_trophy
sound_set_75
eleblock3
xmas11_throne
snowb_divider
toy2
mnstr_rebreed_2
TicTacToe
lc_window2
xm09_bauble_6
cubie_wallshelf_p

Se vocês verem o http://www.habbo.com.br/gamedata/furnidata , irão ver que ele está pulando a linha, não está lendo toda a linha, portando, me ajudem!

jomp16

Melhorei meu algoritmo, porém ainda não cumpre o que eu quero, eu tentei de tudo, quebra de linha quando chegar ao “],[” - O \n fica no lugar do , - quebrou a linha, tinha tudo para dar certo, porem essa porra só insiste em pegar só a que começam com o [[ (talvez porque é uma linha separada sem o \n, aí eu fiz um algoritmo que criava um novo arquivo, e fazia um replace antes do if(blah.contains("\n") { printWriter.println(); }, porém quando eu faço isso, o txt fica mais bugado ainda, o String[] não suporta o vazio que o printWriter.println(); faz)

Novo algoritmo

try { bf1 = new BufferedReader(new FileReader("DOWNLOADS/" + RELEASE_NAME + "/gamedata/furnidata.txt")); String teste1; while ((teste1 = bf1.readLine()) != null) { String teste2 = teste1.replace("[\"", "").replace("\"],[\"", ""); String teste4[] = teste2.split("\""); System.out.println(teste4[4]); } } catch (IOException e) { System.out.println(e.getMessage()); }

PRECISO DE AJUDA!

E

Não é por nada não, mas isso não lembra CSV ou JSON? Acho que daria para você usar alguma coisa parecida com isso. Não capriche muito em expressões regulares :slight_smile:

jomp16

Eu nunca ouvi falar do CSV ou JSON, por isso eu não sei como é. Se você puder explicar ou postar um exemplo, eu agradeço. E eu não entendi o que é “expressões regulares”. (só sei o básico do Java, mas eu estou programando a cada dia, assim aprendo mais rápido).

jomp16

Novidades, pedi ajuda para meu amigo gringo que manja de Java, ele me ajudou, aqui segue o código dele:

public static void main(String[] args)
	{
		try
		{
			FileInputStream filestream = new FileInputStream("C:/xampp/htdocs/gamedata/furnidata.txt");
			DataInputStream dataStream = new DataInputStream(filestream);
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(dataStream));

			String f;

			while ((f = bufferedReader.readLine()) != null) 
			{
				if (f.equals("") == false)
				{
					String noBrackets = f.replace("[\"", "").replace("\"],[\"", "");
					String backSlashSplit[] = noBrackets.split("\"");
					System.out.println(backSlashSplit[4]);
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

E o resultado do algoritmo com ele é:

http://pastie.org/4751518

Eu feliz por o algoritmo estar pronto e funcionando, eu implementei em meu projeto, resultado? Sempre dá a mesma resposta que o meu algoritmo dava, eu testei isso em IntelliJ IDEA, Netbeans, Eclipse, até tentei criar um projeto do zero e criei um .java e compilei usando o javac, mas essa merda sempre dá a mesma resposta! Eu me pergunto isso: por que será que com meu amigo gringo ele funcionou, mas comigo não funcionou?! Preciso de respostas! Desde já agradeço, jomp16

jomp16

Boas notícias!

Outro meu amigo que manja de C# e Java portou o algoritmo e funcionou em meu sistema!

String fileContents = "";
String lineBuffer;

BufferedReader bf1  = new BufferedReader(new FileReader("furnidata.txt"));
while((lineBuffer = bf1.readLine()) != null) {
    fileContents += lineBuffer;
}
bf1.close();

String[] hofFurniFiles1 = fileContents.split("\\[\\\"");
for(String e : hofFurniFiles1) {
    if(e.length() < 4)
        continue;

    String[] hofFurniFiles2 = e.split("\\\"\\]\\,\\[\\\"");
    for(String f : hofFurniFiles2) {
        if(f.length() < 4)
            continue;

        String[] parts = f.split("\\\"");
        String FileName = parts[4].split("\\*")[0];
        System.out.println(FileName);
    }
}

Até que enfim eu consegui o que eu queria, e eu posso fechar esse tópico ;)

Criado 17 de setembro de 2012
Ultima resposta 19 de set. de 2012
Respostas 7
Participantes 2