2010-03-11 12 views
1

Je génère un fichier Excel via MATLAB et j'ai des cellules vides au milieu. Voici le code que je utilise pour initialiser une matrice vide:Travailler avec XLSWRITE dans MATLAB: Comment supprimer des cellules vides?

newfile = cell(5,5); 
[newfile{:}] = deal(''); 
[newfile{:}] = deal(' '); 

je puis faire un peu de traitement et écrire les données dans un fichier en utilisant xlsEcriture. La feuille de calcul finit par avoir des cellules vides et des données. Y at-il une commande par laquelle je peux supprimer les lignes vides, sans affecter les lignes qui contiennent des données?

Une autre question:

Est-il possible d'ajouter sur ce fichier Excel? J'utilise ce fichier tous les jours et je voudrais ajouter automatiquement des données plutôt que de copier et coller manuellement tous les jours.

++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++++++++ Ajout à la question ci-dessus :

Si mon fichier de sortie ressemble

1,8 3 -4,7

1,87 3,9 -5,8

1,84 2,8 -4,3

2 3,2 -4,7

2 3,7 -6
2 3,6 -5,2
3 4,3 -6,5

13 4,2 13,1

12 3,5 -6,3

1,65 1,9 -4,4

Alors, comment puis-je supprimer les lignes vides lorsque ce n'est pas dans la cellule que cellfun ne fonctionne pas pour cela

+1

Je suis curieux ... pourquoi vous traitez une chaîne vide, puis un espace aux cellules? La première déclaration de transaction est inutile car les valeurs de la cellule sont simplement écrasées par la seconde déclaration de transaction. – gnovice

+0

question connexe. de toute façon autre que de créer une chaîne vide. Y at-il une commande comme zéros (x, y) qui crée des cellules vides, sans avoir à utiliser les conversions num2cell dans everystep après? quelque chose comme newfile = vide (x, y) qui me donnerait une matrice avec des blancs de dimension x, y –

+0

@AP: Vous pourriez faire quelque chose comme ceci: 'newfile = repmat ({''}, x, y) ; ' – gnovice

Répondre

1

Si je comprends bien la première partie de votre question, vous voulez supprimer toutes les lignes de votre tableau de cellules newfile qui contiennent uniquement des cellules vides. Vous pouvez le faire en utilisant la fonction CELLFUN pour trouver des cellules vides, en utilisant la fonction ALL pour trouver les lignes qui contiennent toutes les cellules vides, puis en utilisant logical indexing pour supprimer ces lignes:

>> newfile = cell(5,5); %# Empty cell array 
>> newfile(:) = {''}; %# A different way to assign values without DEAL 
>> newfile([1 2 4 5]) = {'a'} %# Make some non-empty cells 

newfile = 

    'a'  ''  ''  ''  '' 
    'a'  ''  ''  ''  '' 
    ''  ''  ''  ''  '' 
    'a'  ''  ''  ''  '' 
    'a'  ''  ''  ''  '' 

>> emptyIndex = cellfun('isempty',newfile) %# Logical index of empty cells 

emptyIndex = 

    0  1  1  1  1 
    0  1  1  1  1 
    1  1  1  1  1 
    0  1  1  1  1 
    0  1  1  1  1 

>> newfile = newfile(~all(emptyIndex,2),:) %# Removes 3rd row 

newfile = 

    'a'  ''  ''  ''  '' 
    'a'  ''  ''  ''  '' 
    'a'  ''  ''  ''  '' 
    'a'  ''  ''  ''  '' 

EDIT: Si vous initialisez votre tableau de cellules newfile avec des espaces vides (' ') au lieu de chaînes vides ('') vous devrez modifier la façon dont vous calculez emptyIndex dans le code ci-dessus. L'argument CELLFUN'isempty' doit être remplacé par @(x) strcmp(x,' ') pour obtenir les mêmes résultats.



En ce qui concerne votre deuxième question, vous pouvez spécifier dans votre appel à XLSWRITE la feuille et la gamme ligne/colonne dans le fichier où vous souhaitez ajouter vos données.Si vous ajoutez au fichier une fois par jour, la solution la plus simple consiste à ajouter une nouvelle feuille avec la date comme nom. Ce qui suit écrit les données dans M au fichier fileName, l'ajout d'une nouvelle feuille qui est nommé à la date et l'heure:

xlswrite(fileName,M,datestr(now)); 
+0

pour ajouter au fichier Excel. J'ai 4 dossiers et je les nomme comme M_2010_03_11.xls, N_2010_03_11.xls et ainsi de suite. Comment puis-je fusionner à un fichier par son nom, disons M.xls, N.xls par votre méthode, je ne peux pas appeler par rangée/colonne comme ils sont diff chaque jour et si je regarde manuellement, je pourrais aussi bien copier et coller (comme je le fais directement sur excel manuellement) –

+0

@AP: Je ne suis pas totalement sûr de ce que vous voulez dire. Il semble que vous ayez déjà un tas de fichiers Excel séparés que vous voulez fusionner en un, alors que ma solution ci-dessus suppose que vous avez déjà un fichier et que vous y ajoutez une nouvelle valeur de données en tant que nouvelle feuille. Pour combiner vos fichiers existants, je suppose que vous pourriez les boucler, en appelant XLSREAD pour obtenir les données brutes (ie [junk, junk, raw] = xlsread (fileName), ') et en écrivant les données brutes pour séparer les feuilles en une fichier. – gnovice

+0

@gnoice, Non tu m'as bien compris à la première fois. Je lance ce programme tous les jours en fonction de mes fichiers quotidiens. Et je génère 4 fichiers. Il serait bon, si les nouveaux fichiers 4 sont ajoutés comme je cours le programme plutôt que je change manuellement les noms tous les jours et manully les fusionner au fichier de la veille. –