import fisier text cu linii de text variabile

Ce este nou in Microsoft Excel 2016?
Informatii despre cum se utilizeaza Microsoft Excel 2016
Calcule, Formule, Functii, Tabele pivot, Analiza datelor, etc
a3dess
Mesaje: 10
Membru din: Mar Iun 07, 2011 5:25 pm

import fisier text cu linii de text variabile

Mesaj de a3dess » Mie Ian 23, 2019 10:21 pm

Salut! Sunt nou pe site si m-am lovit de o mica problema:
Am un fisier txt cu date legate de utilizatorii unui joc (statistic in joc) - atasez mai jos un sample!
Problema este ca utilizatorii pot avea mai multe nume ca nickname si pot fi membrii ai unei aliante care poate avea de asemenea mai mult cuvinte ca denumire. Cand import fisierul in excel, evident al doilea nume din nick imi deplaseaza spre dreapta toate celelalte coloane! La fel si cu denumirea pentru alianta!
Acum, am gasit o solutie "babeasca": prelucrez eu manual fisierul text (jocul este nou, nu are foarte multi utilizatori :) ) adaugand un "_" intre fiecare nume din nick... :))) problema este ca jocul este in crestere, volumul de date fiind in crestere... asa ca, am nevoie de VBA...
Ma poate ajuta cineva?
Banuiesc ca scriptul va trebui sa parcurga fiecare linie si sa verifice daca urmatoarea coloana este text sau nu, si daca este text, doar sa faca "concatenate" in coloana text anterioara!

Multumesc frumos!
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

DR.ACCESS
Moderator
Moderator
Mesaje: 300
Membru din: Lun Sep 05, 2011 5:06 pm

Re: import fisier text cu linii de text variabile

Mesaj de DR.ACCESS » Joi Ian 24, 2019 7:28 am

N-at fi fost mai bine sa atasati un samplr pentru fisierul text?
Sa pornim de la cauza nu sa tratam efectul
In aplicatia din care "iese" fisierul text, aveti cumva optiunea de a alege ca "text delimiter" tab in loc de space?
sau sa extrageti fisierul in format CSV?
D. Tanase
MCT, MCTS
MOS Master Instructor

IPP
Moderator
Moderator
Mesaje: 4197
Membru din: Mie Iul 29, 2009 7:26 am
Localitate: Cluj-Napoca

Re: import fisier text cu linii de text variabile

Mesaj de IPP » Joi Ian 24, 2019 7:43 am

Buna ziua

Se pare ca informatia ajunge in Excel via data connection dintr-un fisier text exportat in prealabil din alta parte.
Probabil varianta cea mai buna ar fi sa se rezolve "la sursa" acel decalaj (fie direct in aplicatie, fie in rutina de export ca fisier txt)

Altfel daca nu se poate cele de mai sus eu as incerca urmatorii pasi:
-foaie dedicata in care vine informatia prin conexiunea de date;
-foaie dedicata pentru prelucrare/forma finala

Prelucrarea insemnand:
-stergere eventuala informatie veche
-copiere din foaia sursa (cea in care ajunge informatia prin conexiunea de date) in foaia destinatie a informatiei ca valori.
-macro pentru parcurgerea informatiei de pe unele coloane; in functie de informatie (text sau numar) va face concatenare urmata de stergere celule

Eu as sugera sa vedeti intai daca se poate rezolva la sursa; de asemenea si solicitarea lui dr.Access privind fisierul text original (nu tot dar cu mai multe informatii relevante, preferabil cu toate situatiile ce pot sa apara si ar trebui tratate de un eventual macro) ar trebui sa o luati in considerare.

IP

IPP
Moderator
Moderator
Mesaje: 4197
Membru din: Mie Iul 29, 2009 7:26 am
Localitate: Cluj-Napoca

Re: import fisier text cu linii de text variabile

Mesaj de IPP » Joi Ian 24, 2019 8:44 am

Buna ziua

Atasat aveti spre testare un fisier care incearca sa exemplifice cele afirmate in mesajul meu anterior. In aceasta forma codul ar trebui sa trateze situatiile in care Numele si/sau Numele aliantei e compus din maxim 3 denumiri

Premise: nu se redenumesc foile (sau se editeaza in cod); data connection va aduce de fiecare data informatia in aceeasi structura de coloane, structura ce nu va fi modificata nici ulterior, manual, de altcineva.
Macro se va rula dupa ce faceti refresh la data connection

Am folosit codul:

Cod: Selectaţi tot

Sub Prelucreaza()

'IPP - 24.01.2019

Dim lRow As Long

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'sterge info veche
Sheets("Prelucrat").Range("A1").CurrentRegion.Offset(1, 0).Clear

'copiaza info brut
Sheets("dataConn").Range("A3").CurrentRegion.Copy
Sheets("Prelucrat").Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

lRow = Range("A1000000").End(xlUp).Row

For i = 1 To 3
 For Each c In Range("B3:B" & lRow)
    If IsNumeric(c) = False Then
        c.Offset(0, -1) = c.Offset(0, -1) & "_" & c
        c.Delete Shift:=xlToLeft
    End If
 Next c
Next i

For i = 1 To 3
 For Each c In Range("AB3:AB" & lRow)
    If IsNumeric(c) = False Then
        c.Offset(0, -1) = c.Offset(0, -1) & "_" & c
        c.Delete Shift:=xlToLeft
    End If
 Next c
Next i

Range("B2").EntireRow.Delete
Range("A1").Select

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
Acesta: sterge eventuala informatie veche din foaia Prelucrat; copiaza ca valori informatia de interes; parcurge o anumita coloana cu nume de 3 ori, la fiecare trecere verifica tipul informatiei. Daca este text atunci face concatenare in celula din stanga urmata de stergerea celulei de test; face la fel pentru coloana cu numele aliantei; sterge randul 2 ce pana acum era gol pentru a avea o lista compacta.
Pentru testare: deschideti fisierul atasat, activati macro/continutul si rulati macro numit "Prelucreaza"
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

IPP
Moderator
Moderator
Mesaje: 4197
Membru din: Mie Iul 29, 2009 7:26 am
Localitate: Cluj-Napoca

Re: import fisier text cu linii de text variabile

Mesaj de IPP » Vin Ian 25, 2019 7:48 am

Buna ziua

Atasat gasiti un fisier cu un cod care face acelasi lucru ca cel anterior dar, teoretic optimizat

Cod: Selectaţi tot

Sub Prelucreaza()

'IPP - 25.01.2019

Dim lRow As Long

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

Sheets("Prelucrat").Range("A1").CurrentRegion.Offset(1, 0).Clear

Sheets("dataConn").Range("A3").CurrentRegion.Copy
Sheets("Prelucrat").Select
Range("A3").Select
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False

lRow = Range("A1000000").End(xlUp).Row

 For Each c In Range("A3:A" & lRow)
  Do While IsNumeric(c.Offset(0, 1)) = False
        c.Value = c.Value & "_" & c.Offset(0, 1).Value
        c.Offset(0, 1).Delete Shift:=xlToLeft
  Loop
 Next c

  For Each c In Range("AA3:AA" & lRow)
  Do While IsNumeric(c.Offset(0, 1)) = False
        c.Value = c.Value & "_" & c.Offset(0, 1).Value
        c.Offset(0, 1).Delete Shift:=xlToLeft
  Loop
 Next c

Range("B2").EntireRow.Delete
Range("A1").Select

Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True

End Sub
Altfel, daca problema reala este modul de export in fisierul text (separatorul find spatiu in loc de alt caracter care sa nu lase loc de confuzii) asa cum s-a observat deja, cea mai buna varianta va ramane corectarea in aplicatia originala.

IP
Nu aveţi permisiunea de a vizualiza fişierele ataşate acestui mesaj.

a3dess
Mesaje: 10
Membru din: Mar Iun 07, 2011 5:25 pm

Re: import fisier text cu linii de text variabile

Mesaj de a3dess » Vin Ian 25, 2019 10:42 pm

salut! in urma sugestiilor dumneavoastra, am vorbit cu moderatorii jocului, care mi-au raspuns pozitiv! au schimbat formatul fisierului text exportat, l-am importat folosind data connection si acum merge ca uns - in coloana pt nume apare numele complet! Va multumesc frumos pentru ajutor!
P.S. am salvat oricum variantele de cod, pentru a le testa, poate reusesc sa inteleg ceva din ele si sa capat ceva mai multa experienta in VBS! Inca o data, multumesc!

Scrie răspuns

Înapoi la “Intrebari despre Excel 2016”