2010-07-13 5 views
1

Comment puis-je revenir au tout début d'un fichier CSV et ajouter des lignes?Comment insérer des données en haut d'un fichier CSV?

(J'imprime un fichier CSV à partir de C en utilisant fprintf() .A la fin de l'impression de milliers de lignes (5 colonnes) de données, je voudrais revenir en haut du fichier et insérer quelques données d'en-tête dynamiques (en fonction de la façon dont les choses sont allées tout imprimer).)

Merci.

Répondre

5

En raison de la façon dont les fichiers sont structurés, c'est plus ou moins impossible. Pour accomplir ce que vous voulez:

  1. écrire des données csv à file1
  2. tête d'écriture à file2
  3. contenu de la copie de fichier1 fichier2
  4. supprimer fichier1

Ou vous pouvez tenir les données csv dans RAM et l'écrire dans le fichier après que vous avez terminé le traitement et connaissez l'en-tête.

Une autre option consiste à mettre de côté un certain nombre d'octets pour l'en-tête, ce qui fonctionnera beaucoup plus rapidement pour les gros fichiers pour un coût d'espace minimal. Étant donné que l'espace est alloué dans le fichier au début de l'écriture, il n'y a aucun problème en remontant et en le remplissant. Rouvrez le fichier en tant qu'accès aléatoire ("r +"), qui pointe vers le haut du fichier par défaut , écrivez l'en-tête et fermez.

+0

ressemble à 2 fichiers est le seul moyen d'ajouter des données d'en-tête dynamiques, merci. –

1

Je pense que ce n'est pas possible. Probablement le moyen le plus simple serait d'écrire la sortie dans un fichier temporaire, puis de créer les données dont vous avez besoin comme en-tête dynamique, de les écrire dans le fichier cible et d'ajouter le fichier temporaire précédemment créé.

+0

créatif, agréable .... –

1
  • écrire suffisamment de places vides dans la première ligne
  • de données d'écriture
  • seek (0)
  • tête d'écriture - dernière colonne sera complétée avec des espaces
+0

"écrire suffisamment d'espaces vides dans la première ligne" - est-ce en supposant que l'en-tête est ajouté sur une ligne? –

+0

Non, le nombre réel d'octets que prendra votre en-tête. Cela peut couvrir autant de lignes que vous le souhaitez. –

+0

Ce n'est utile que s'il connaît exactement le nombre de lignes à ajouter. –

2

La façon la plus simple serait pour stocker simplement tout le contenu du fichier en mémoire jusqu'à ce que vous avez terminé, écrivez l'en-tête, puis écrivez le reste du fichier.

Si la mémoire est un problème et que vous ne pouvez pas stocker en toute sécurité le fichier entier en mémoire, ou si vous ne voulez pas, vous pouvez écrire la majeure partie des données CSV dans un fichier temporaire, puis lorsque vous êtes terminé, écrivez l'en-tête dans le fichier principal et copiez les données du fichier temporaire dans le fichier principal dans une boucle. Si vous vouliez vous amuser, après avoir écrit les données CSV principales dans le fichier principal, vous pouvez parcourir le fichier depuis le début, lire en mémoire les données que vous êtes sur le point d'écraser avec l'en-tête, puis écrire l'en-tête au-dessus de ces données, et ainsi de suite, lire chaque morceau dans la mémoire, écraser avec le précédent jusqu'à la fin et ajouter le morceau final. De cette façon, vous "insérez" des données au début, en déplaçant le reste du fichier vers le bas. Je ne le recommanderais vraiment pas car cela ajouterait simplement de la complexité sans beaucoup d'avantages, à moins qu'il y ait une raison spécifique pour laquelle vous ne pouvez pas faire quelque chose de plus simple comme utiliser un fichier temporaire.

Questions connexes