Je crée un programme qui lit un fichier texte et obtient les données, puis la met dans un tableau. Mon problème est qu'il y a des cas où une colonne est destinée à être vide mais la valeur vide doit toujours être considérée comme une valeur mais lorsque mon programme lit la colonne vierge, il lit la valeur suivante et la met dans le tableau où la valeur devrait être 0 ou vide. J'ai essayé de compter les espaces entre chaque colonne pour en faire une condition, mais les espaces ne sont pas fiables car les données varient de longueur. Toutes idées sur la façon dont je pourrais faire cela?
Voici ce que mes données de texte ressemblent. P> J'ai besoin de mon tableau pour ressembler à ce p> firstRow['1.325','1.57','51.2'];
secondRow['2.2','0','21.85'];
3 Réponses :
Si votre fichier est code> onglet code> -splitté, utilisez line.split ("\ t") code> pour obtenir une éventuelle des sous-chaînes de chaque ligne. Ensuite, chaque sous-chaîne vous pouvez convertir en votre type de données. Dans votre cas, il doit être nullable, e, g,
décimal? Code>. P>
Ce n'est pas l'onglet écarté :(
Voici un point de départ Si vous avez une liste d'en-têtes dans l'ordre dans lequel ils apparaissent dans les données et si vos valeurs sont toujours alignées sur les en-têtes.
import io, csv, sys data = '''\ Data 1 Data 2 Data 3 1.325 1.57 51.2 2.2 21.85 12.5 25.13 15.85 13.78 1.85 ''' headers = ['Data 1', 'Data 2', 'Data 3'] # order should match headers f = io.StringIO(data) h = f.readline() indexes = [h.find(s) for s in headers] rows = [] for line in f: line = line[:-1] # strip trailing linefeed d = {} for key, index in list(zip(headers, indexes))[::-1]: # slice from the right val = line[index:] line = line[:index] d[key] = val.strip() rows.append(d) writer = csv.DictWriter(sys.stdout, headers) writer.writeheader() writer.writerows(rows)
Étant donné que j'ai manqué de temps, ce que j'ai fait était de compter le nombre d'espaces et si les espaces dépassent par un nombre (dans mon cas, 10), je vais ajouter une valeur vide de valeur dans mon tableau
string[] lsData = pData.Split(' '); string[] lsData1 = new string[18]; int newArrayData = 0; int spaceCounter = 0; for (int i = 0; i < lsData.Length; i++) { if (lsData[i] != "") { lsData1[newArrayData] = lsData[i]; newArrayData++; spaceCounter = 0; } else { spaceCounter++; } if (spaceCounter >= 10) { lsData1[newArrayData] = ""; newArrayData++; spaceCounter = 0; } }
Il est très imprévisible à moins que la longueur de la colonne ne soit fixe ou que des valeurs soient délimitées par certains caractères. virgule. Si vous avez le contrôle sur le fichier, essayez de le générer avec le format CSV.
Utilisez vos en-têtes Démarrage de décalage comme des colonnes absolues offset (chaque "D" de "Datax") et la distance entre elles comme largeur de colonne absolue. Ensuite, pour chaque ligne suivante, vous vous séparez à l'aide de la fonction de sous-chaîne.
Ceci est un problème délicat, si possible, vous modifiez les données sur un format CSV. Cependant, si tout est tout ce que vous avez, vous auriez besoin de travailler sur la largeur maximale de la colonne et de traverser votre chemin à travers
Les espaces ne sont pas fiables car les données varient en longueur code> s'il n'y a aucun moyen de déterminer si un certain nombre d'espaces représentent une lacune dans les données ou non, il n'y a aucun moyen de le faire.
Est-ce que l'en-tête ressemble toujours à ce
data1 data2 data3 code>?
Il n'est pas clair si vous avez un format de longueur fixe ou non. Si toutes les lignes ont la même longueur, la méthode Split n'est pas la bonne à utiliser, vous pouvez plutôt compter facilement la longueur de chaque "colonne" et extraire des blocs de données avec la sous-chaîne de toute la ligne.
@Thegeneral non, sa seule une petite partie du fichier texte que j'ai un problème avec
L'en-tête change-t-il? Je veux dire, si vous lisez ce fichier demain, l'en-tête va être la même (exactement le même)
@Thegeneral si c'est ce que vous voulez dire, oui.
Les noms de colonne d'en-tête ont-ils des espaces. Ou dire que les noms de colonne sont-ils toujours un mot (pas d'espaces)? Si nous pouvons faire des hypothèses, nous pouvons écrire une solution pour cela.
@Thegeneral Il y a des espaces dans les en-têtes, mais je dois également dire que les espaces entre chaque en-tête varie en fonction de la longueur du nom d'en-tête.
Pouvez-vous coller l'en-tête merci et la première ligne de données dans la question
Si vous avez une liste d'en-têtes et que vos données sont toujours alignées sur les en-têtes, vous pourrez peut-être effectuer une tranchée de chaîne à partir des positions d'en-tête.