2010-03-16 5 views
1

J'ai un fichier CSV. La première ligne contiendra toujours les en-têtes de colonne. En fonction d'une variété de facteurs, l'ordre des colonnes peut changer et, dans de rares circonstances, certaines colonnes peuvent ne pas être présentes. Ces changements sont hors de mon contrôle.Traitement des modifications dans l'ordre des colonnes lors de l'importation de fichiers CSV

Mes pensées, jusqu'ici, sur la façon de résoudre ce problème. Je vais lire la première ligne du fichier et utiliser les valeurs pour générer une liste de colonnes contenues dans le fichier source. Le fichier de destination utilisera les mêmes noms de colonne que la source. Cela devrait être aussi simple que de chercher des noms identiques dans la source et la destination, puis simplement de mapper les valeurs d'index des colonnes, n'est-ce pas?

Quelles sont vos recommandations pour gérer cela?

+0

Qu'est-ce que vous essayez de faire avec le fichier CSV? Transformez-vous simplement le fichier en un avec les colonnes dans un ordre particulier? Allez-vous insérer des valeurs vides pour les colonnes manquantes? Qu'essayez-vous exactement d'accomplir? –

+0

Oui, c'est une simple transformation. Si la colonne n'existe pas dans le fichier source, elle sera null dans la destination. – DenaliHardtail

Répondre

0

Je l'ai fait une fois en créant une carte de hachage des noms des colonnes que je pensais être là pour les index (ou les noms de colonne réels) des en-têtes de colonne qui étaient réellement présents. Je l'ai fait en construisant d'abord la carte avec tous les noms de colonnes que j'attendais en tant que clés et certaines valeurs comme -1 comme valeurs. J'ai ensuite obtenu le tableau des en-têtes de colonne. Avec une boucle imbriquée parcourant la boucle pour toutes les clés de la carte et tous les en-têtes présents dans le fichier, j'ai fait une comparaison insensible à la casse après avoir coupé les espaces, s'il y avait une correspondance, j'ai mis l'index de la colonne pour cette clé sur la carte. Ensuite, lors de la construction du fichier de destination, tout ce que je devais faire était de parcourir les touches de la carte pour chaque ligne du CSV et d'obtenir les données de l'index spécifié dans la carte et de faire ce que je veux avec les données. La valeur sur la carte était -1. Je l'ai fait en Java, mais j'imagine que c'est presque exactement la même chose en C#.

-1

Si j'allais faire cela, j'utiliserais SQL et DAO. Il y a 2 astuces. le premier est d'établir une connexion à la feuille de calcul Excel comme si elle était une table de base de données (vous aurez besoin de la bibliothèque d'objets DAO 3.6 comme une référence dans la VBA),

Dim dbtmp As dao.Database 
Dim qd As dao.QueryDef 

Set dbtmp = OpenDatabase(mPath & "\" & mName, False, True, "Excel 8.0;") 
Set qd = dbtmp.CreateQueryDef("", " THE QUERY ") 
qd.Execute 

et le second est d'établir une connexion au fichier CSV en tant que source de données. Le format de c'est quelque chose comme:

mQuery = "SELECT * FROM [Text;HDR=NO;CharacterSet=437;DATABASE=" 
mQuery = mQuery & mpath 
mQuery = mQuery & "]." 
mQuery = mQuery & mfile 
mQuery = mQuery & ";" 

Vous devrez construire le SQL en utilisant le code, vous devez établir les champs dans le sourcefile, et vous construisez une requête INSERT INTO. Et il est probablement plus simple de créer la requête de sélection avec un nom, puis de l'utiliser dans l'insertion

L'avantage de ceci est que le SQL s'occupera des champs manquants dans les données source , et l'ordre dans lequel les colonnes apparaîtront ne sera pas difficile. Vous pouvez obtenir les titres en ouvrant le fichier csv sous forme de fichier texte.

Questions connexes