2016-01-28 2 views
0

C'est en quelque sorte une sorte de question «quelle direction est la meilleure». J'ai un fichier .CSV qui est dans un format moins qu'idéal. Je vais schématiser le fichier ci-dessous pour que vous puissiez voir de quoi je parle. Ce fichier me est fourni par un vendeur qui devrait savoir mieux ... (Google, tousse, bidouille, tousse). Quelle est la meilleure façon d'importer seulement table2 à partir de ces données en utilisant VBA?Comment importer des données à partir d'un CSV falsifié à l'aide de VBA

Je vais énumérer les méthodes que j'ai essayées après le diagramme.

fichier .csv ressemble à ceci si ouvert:

Title Cell 
File Info Cell 
Time Date Cell 

Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
Data1, Data 2 
....(continues for around 800 rows) 

Second Table Title Cell 
Col1Title, Col2Title, ColTitle, Col4Title ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns)  
Data 3, Data4,  Data 5, Data6 ....(continues for around 50 columns) 
...(Continues for around 1500 rows) 
End of CSV 

J'ai jusqu'ici tenté de l'objet ADODB mais qui repose sur de requête SQL (connaissances à mon limitée SQL) suppose que les données sont formated correctement comme une table - dont il n'est pas ici.

J'ai aussi essayé de lire le fichier ligne par ligne.

Je pourrais forcer l'une ou l'autre de ces deux solutions à fonctionner, mais c'est assez compliqué dans les deux sens. Je me sens comme il doit y avoir une façon propre de faire cela? Est-ce que n'importe qui peut suggérer une meilleure approche ou une approche efficace aux méthodes que j'ai déjà essayées?

Merci d'avance.

addendum

@ user3724 ce que j'ai essayé sur la ligne par l'approche de la ligne:

Open strFile For Input As #1 

    countLine = 0 

    Do Until EOF(1) 
    Line Input #1, LineFromFile 
    (Increment countLine) 
    (Break line into array) 
    (strComp() each element with the value for title of Table 2) 
    (When strComp() returns true return countLine as upperValue) 
    (Exit Loop) 
Loop 

countLine = 0 

Do Until EOF(1) 
    Line Input #1, LineFromFile 
    (Increment countLine) 
    If countline is >= uppervalue 
     (Parse line and return it to target row of target worksheet) 
    End If 
Loop 

Quand je code cette chose sur c'est un gâchis lent - beaucoup de if déclarations et boucles dans les boucles. @ user3724, pourriez-vous l'examiner en fonction de votre expérience?

+0

Importer où désolé? Serveur SQL? – Gareth

+0

Ouvrez le fichier dans Excel et analyser les données de la feuille? –

+0

J'ai fait quelques modifications. Je veux importer uniquement Table2 à partir de ces données dans une feuille de calcul Excel - en utilisant bien sûr VBA. –

Répondre

1

Je n'ai pas de réputation à commenter ... Mais je peux ajouter une réponse. Si vous voulez utiliser vba, ouvrez le fichier et lisez ligne par ligne (par exemple en utilisant une ligne) omettez les lignes jusqu'à ce que vous détectiez la deuxième chaîne vide, puis parsez les en-têtes (deux lignes suivantes) taille prédéfinie du tableau dépend du format du fichier). Le reste de la "deuxième" table lit juste ligne par ligne et analyse chaque ligne en tableau (je recommande un tableau dynamique avec la première dimension en comptant sur le nombre d'en-têtes) la seconde augmentation de la diminution avec chaque ligne analysée. Après tout, vous recevrez deux tableaux avec les légendes/noms de champs/colonnes et le second avec les données. les deux tableaux ont les mêmes premières dimensions. La deuxième étape télécharge des données via ado à l'aide de tableaux. J'ai utilisé la méthode pour importer des données à DB via ado à partir de fichiers CSV avec une structure étrange, tout comme le vôtre

+0

Merci pour la réponse. On dirait que tu as une bonne solution mais ta réponse est un peu dense (ou je suis un peu dense ...). Pourriez-vous donner un exemple rapide? Je vais inclure ce que j'expérimente actuellement dans un addendum à la question. –

+1

Ici: https://yadi.sk/d/ocV-wDNonvnTG Il y a deux fichiers dans l'archive. Le premier est * .xlsm et le second * .csv le vérifie et le modifie par vous-même – ptrvoid

+0

Merci pour le téléchargement, très instructif. Y at-il une raison d'utiliser ADO avec cette méthode?Si j'ai les lignes que je veux déjà parsées dans la mémoire pourquoi les écrire juste à ma feuille de calcul d'Excel? Ou y a-t-il quelque chose qui me manque? –