[ Foro de Python ]

Hay alguna manera de que pueda fácilmente dividir una cadena en espacios, excepto cuando el espacio está entre comillas. Sin tener que importar nada nuevo

28-Dec-2021 20:17
Jan Fischer
3 Respuestas

Hola, buenos dias, estoy recien comenzando a ocupar python y necesito separar una cadena de un archivo csv, que seria por ejemplo este:
4811597 0 "B54 UE D VOLME" "B 54" 2,3 "II" 405449 5662603 51,1071057974937 7,64939794923743 "https://www.google.de/maps/@51.10710579749373,7.649397949237425,16z"
Mi pregunta seria; como es posible separar cada termino por  espacios, menos cuando este se encuentra dentro de las comillas. Seria de gran ayuda su respuesta. Saludos y gracias de antemano


29-Dec-2021 06:27
Invitado (diego)

hola jan

si no entiendo mal pretendes crear una lista en que los elementos serán las palabras separadas por espacios, menos los caracteres que está entrecomillados que irán juntos

con split() puedes hacerlo, primero separando por " y el que no tenga " lo separas por espacios

suerte ;-)


25-Jan-2022 00:32
Invitado (Bruce Pepe)

Para la cadena:
text = '4811597 0 "B54 UE D VOLME""B 54" 2,3 "II" 405449 5662603 51,1071057974937 7,64939794923743 "https://www.google.de/maps/@51.10710579749373,7.649397949237425,16z"'

El código siguiente:


def linesplitter(line):
    ctr=0
    actualword=''
    tempstore=[]

    while ctr < len(text) - 1:
        if text[ctr] == '"':
            ctr += 1
            while text[ctr] != '"':
                actualword += text[ctr]
                ctr += 1
                if ctr == len(text):
                    break
            tempstore.append(actualword.strip())
            actualword = ''
        else:
            actualword+=text[ctr]
            ctr+=1
            while text[ctr]!=' ':
                actualword+=text[ctr]
                ctr+=1
                if ctr==len(text):
                    break
            tempstore.append(actualword.strip())
            actualword=''
        ctr+=1

    return tempstore


res= linesplitter(text)
print(res)


Retorna:
['4811597', '0', 'B54 UE D VOLME', 'B 54', '2,3', 'II', '405449', '5662603', '51,1071057974937', '7,64939794923743', 'https://www.google.de/maps/@51.10710579749373,7.649397949237425,16z']

Espero que te ayude.


26-Jan-2022 20:08
Invitado (An?nimo)

Respondo por segunda vez. Parece que el moderador está realmente ocupado.


def linesplitter(line):
    ctr=0
    actualword=''
    tempstore=[]

    while ctr < len(text) - 1:
        if text[ctr] == '"':
            ctr += 1
            while text[ctr] != '"':
                actualword += text[ctr]
                ctr += 1
                if ctr == len(text):
                    break
            tempstore.append(actualword.strip())
            actualword = ''
        else:
            actualword+=text[ctr]
            ctr+=1
            while text[ctr]!=' ':
                actualword+=text[ctr]
                ctr+=1
                if ctr==len(text):
                    break
            tempstore.append(actualword.strip())
            actualword=''
        ctr+=1

    return tempstore

Si la linea introducida es:
text = '4811597 0 "B54 UE D VOLME""B 54" 2,3 "II" 405449 5662603 51,1071057974937 7,64939794923743 "https://www.google.de/maps/@51.10710579749373,7.649397949237425,16z"'

res= linesplitter(text)
print(res)

devuelve:
['4811597', '0', 'B54 UE D VOLME', 'B 54', '2,3', 'II', '405449', '5662603', '51,1071057974937', '7,64939794923743', 'https://www.google.de/maps/@51.10710579749373,7.649397949237425,16z']


Espero que te ayude.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)