Jump to content

remover / seleccionar caracteres em strings


joombla
 Share

Recommended Posts

Boas. Estou a fazer uma aplicação em VB.net para organizar músicas de karaoke (.mp3 + .cdg). Abre uma pasta com 1000 músicas e move-as para outra pasta com um ID.

Ficando: 1.mp3, 1.cdg, 2.mp3, 2.cdg, ... (para depois, numa base de dados, ao pesquisar pela música aparecer o ID e abrir directamente no programa de KARAOKE)

Mas, antes de alterar o nome para um ID, tenho que corrigir o título das músicas para gravar na base de dados o Cantor e o nome da Música, para mais tarde a localizar.

Já meti a detectar as músicas de uma pasta e a mover para outra. O problema é que as músicas não têm todas o mesmo formato de nome.

Exemplo:

56-Banda Eva - Arerê.mp3

56-Banda Eva - Arerê (1).cdg

240 - Timbaland, Keri Hilson & Nicole Scherzinger - Scream.cdg

240 - Timbaland, Keri Hilson & Nicole Scherzinger - Scream.mp3

U2 - I Still Haven't Found What I'm Looking For.cdg

U2 - I Still Haven't Found What I'm Looking For (1).mp3

Algumas têm ID - ARTISTA - MUSICA - NUMERO outras não têm ID, outras não têm NUMERO, etc...

Há uma maneira de brincar com a string do nome das mesmas, apagar o que vem antes do - e o que vem depois?

Por exemplo:

56-Banda Eva - Arerê (1).cdg

Detectar se a música tem {(1)}, se sim apagar. detectar de tem ID {56-} se sim apagar. E no resultado final ficar {Banda Eva - Arerê.cdg}

Depois com esse resultado final já podia gravar o Cantor e o nome da música na base de dados, e então alterar o nome da música para o ID final.

Bem, sei que é algo confuso, tentei explicar da melhor maneira. 😛

Link to comment
Share on other sites

É muito complicado controlar todas as situações possíveis. Podes criar um método de selecção e correcção automático para os casos mais comuns. Os restantes colocas à parte e crias um método em que o utilizador trata de corrigir manualmente.

Sugestão: para um caso dito "normal", faz um Split da informação (nome do ficheiro) pelo caracter "-" e depois trata a informação que tens. Se é só número e foi o 1º, eliminas a informação. E por aí em diante.

Neste caso tens de ser muito criativo para prever certas situações e padronizá-las, tratando as que estão conforme o previsto e dando as outras ao utilizador.

Automatizar tudo é algo utópico - os nomes dos ficheiros podem aparecer de qualquer forma e feitio, é um pandemónio.

Knowledge is free!

Link to comment
Share on other sites

Pois, já tinha pensado em algo do género: Ao fim de cada selecção ele pergunta ao utilizador se o Artista / Música estão correctos. Se não estiverem para editar manualmente.

Vou criar uma espécie de filtro onde os títulos dos ficheiros vão passar e são modificados.

Género:

Se começar com {integer-}.... Se acabar em {(integer).cdg)}...

O resultado final é mostrado para confirmação dos que passarem pelos filtros. Os que não passarem não altero nada, ficam na pasta sem serem movidas as músicas.

O problema aqui vai ser que vou perder o .mp3 do .cdg porque um deles pode ficar para trás (não passa pelo filtro), mas isso depois penso numa alternativa.

Até agora consegui filtrar o (1) final, mas mesmo assim isto não está em condições.

        Dim teste as string = "56-Banda Eva - Arerê (1).cdg"
        If teste.EndsWith("(1).cdg") Then
            teste = teste.Replace("(1).cdg", String.Empty).Trim
                msgbox (teste)
                '56-Banda Eva - Arerê
        End If

O problema aqui é que pode ser (1) ou (2).cdg

Já tentei algo como:

teste = teste.Replace("(*).cdg", String.Empty).Trim

Mas o * não funciona porque pensa que faz parte da string. Então tentei:

teste = teste.Replace("("+*+").cdg", String.Empty).Trim

Mas também não dá. Já não pegava em vb há algum tempo e de alterar strings nunca percebi muito.

Quem me pode ajudar em strings? Obrigado.

Só preciso algo do género: teste.Replace("(*).cdg", String.Empty).Trim

Link to comment
Share on other sites

Boas

Se o formato se mantiver conforme indicaste

Banda Eva - Arerê.mp3

56-Banda Eva - Arerê.mp3Banda Eva - Arerê (1).cdg

56-Banda Eva - Arerê (1).cdg

E se as repetidas variarem entre 1 e 2 tens aqui um exemplo que está a funcionar. Caso hajam mais numeros 3,4,5,... podes sempre utilizar um ciclo.

O problema aqui é que pode ser (1) ou (2).cdg

Dim inicial As String = "56 - Banda Eva - Arerê(1).cdg"
Dim final As String

Dim aux As Object = inicial.ToCharArray

Dim num_tracos As Integer = 0

        For Each item In aux
            If item = "-" Then
                num_tracos += 1
            End If
        Next

        aux = inicial.Split("-")

        If num_tracos = 2 Then
            final = aux(1) & " - " & aux(2)
        Else
            final = aux(0) & " - " & aux(1)
        End If

        If final.EndsWith("(1).cdg") Then
            final = final.Replace("(1).cdg", String.Empty).Trim
            final &= inicial.Substring(inicial.Length - 4)
        ElseIf inicial.EndsWith("(2).cdg") Then
            final = final.Replace("(2).cdg", String.Empty).Trim
            final &= inicial.Substring(inicial.Length - 4)
        End If

        MsgBox(final)

A informática chegou para resolver problemas que antes não existiam

Quem ri por último é porque está conectado a 52 Kbs.

Link to comment
Share on other sites

Estive a testar com uns títulos que fui tirando e parece funcionar. Ainda não meti isto no código que já tinha, logo começo a trabalhar e quando estiver pronto venho aqui deixar feedback.

Obrigado por me terem ajudado, não conseguia fazer isto, pelo menos assim. 😛

Link to comment
Share on other sites

Para os padrões que apresentas, deixo-te mais uma sugestão:

        Dim inicial As String = "56 - Banda Eva - Arerê(yeye)(2).cdg"
        Dim final As String = String.Empty
        Dim ext As String = inicial.Substring(inicial.LastIndexOf("."))

        inicial = inicial.Replace(ext, "")
        inicial = inicial.Replace(" - ", "-").Replace("- ", "-").Replace(" -", "-")
        inicial = inicial.Replace("(", "-(").Replace(")", ")-")

        For Each P As String In inicial.Split("-")
            If P.Trim = String.Empty Then Continue For
            If P Like "(*)" And IsNumeric(P.Replace("(", "").Replace(")", "")) Then Continue For
            If IsNumeric(P) Then Continue For
            If final = String.Empty Then final &= P.Trim Else final &= " - " & P.Trim
        Next
        final = final.Replace(" - (", "(").Replace(") - ", ")")
        final &= ext

Assenta muito na normalização. Depois de normalizar, actua.

Limpa o sebo a qualquer ID e (numero), mas deixa intactos "outros tipos de parentesis", como o yeye ali no meu exemplo.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Com o código do Andrepereira9 de 1000 ficheiros, consegui mover uns 500 correctamente. Outros ficaram com erros estranhos género: 123-artista.mp3 em vez de artista-faixa.mp3

Acho que é porque algumas músicas na faixa têm mais um -, algo do género: 15 - artista - nome-da-musica.mp3

Ou seja, o nome da faixa já tem o -.

Amanhã testo esse novo método. O mais provável é ter de pedir para confirmar cada uma das músicas manualmente (mostrando algumas informações como o artista e a faixa e pedir para confirmar ou alterar), porque como são muitos ficheiros diferentes o programa não consegue ter um padrão para todos.

Mas como disse, não testei o ultimo código ainda.

Desde já obrigado pela ajuda, amanhã já digo algo. 😛

Link to comment
Share on other sites

Não tenho nenhuma base de dados, mas também acho que não se justifica aqui. O objectivo era um programa simples que reparasse rapidamente as músicas. Ter de ir pesquisar cada uma delas a uma base de dados ia ser demorado e a base de dados podia nem ter todos os cantores e/ou músicas.

Quanto ao código do ribeiro55 já implementei no programa e até agora parece funcionar. Ainda não testei com as 1000 músicas porque não tenho aqui a pasta, mas com os 10 exemplos que tenho aqui no computador não tive problemas.

O código já é um bocado avançado para eu perceber e modificar, mas também não me parece que seja preciso.

Vou criar o programa com 2 métodos:

-um método automático que converte o título do mp3 e procura o respectivo cdg. Se não encontrar deixa os ficheiros na pasta sem os mover.

-um método manual, que pergunta ao utilizador se as informações estão correctas e para ir buscar a localização do cdg. (para as músicas que não passarem no primeiro método)

Bem, mais uma vez obrigado pelo código. Nunca estudei strings em visual basic e só sei as funções básicas.

Penso que posso dar este tópico como resolvido. 😛

Editado: Programa acabado. Corrige o nome do cdg e do mp3, depois compara se o mp3 tem o cdg com o mesmo nome, se sim move para uma pasta e cria um ID, apontando também num txt.

Com este método, de umas 1000 músicas ficam umas 20 para trás, o que não é nada mau. É só editar manualmente e inserir no txt.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.