2009-03-07 11 views
5

Est-ce que quelqu'un sait s'il est possible de concaténer des correspondances résultant d'une recherche dans un seul registre? Par exemple, je dispose d'un fichier avec le contenu suivant:Copier le texte correspondant pour enregistrer

aaa :xxx 123 
bb :y 8 
ccccc :zzzzz 1923 

Maintenant, ce que je veux est de copier colonne commençant par « : » ailleurs. Malheureusement, je ne peux pas utiliser le mode bloc visuel, car la première colonne n'a pas de largeur fixe. J'ai pensé que je pourrais rechercher la deuxième colonne (: \ w +) et stocker les maches dans un registre.

Répondre

8

Une autre façon:

:g/:/norm f:"Aye 

Par :h quote_alpha, si vous utilisez un nom de registre en majuscules, il remplace plutôt que ajoute le contenu du registre. Si vous exécutez cela et vérifier le contenu du registre "a, vous verrez

:xxx:y:zzzzz 

(Peut-être avec sauts de ligne, selon la façon dont vous avez cpoptions ensemble.)

+0

Vraiment jolie. –

0

Je commencerais par analyser le fichier. Pour cette utilisation TextFieldReader plutôt que d'inventer votre propre analyseur CSV:

using Microsoft.VisualBasic.FileIO; 

TextFieldParser reader = new TextFieldReader("C:\MyFile.txt"); 
reader.Delimiters = new string[] { " " }; 
string[] currentRow = null; 
while (!reader.EndOfData) 
{ 
    try 
    { 
     currentRow = reader.ReadFields(); 
     foreach(string field in currentRow) 
     { 
      //save this field... 
     } 
    } 
    catch (MalformedLineException ex) 
    { 
     //handle exception the way you want 
    } 
} 

Une fois que j'ai les données que j'extrairaient juste la colonne que je suis intéressé par Si vous pouvez supposer que chaque ligne a le même schéma, vous pouvez. comprendre la colonne de droite lors de l'analyse de la première ligne, puis en analysant le reste des lignes, vous pouvez simplement enregistrer la colonne appropriée. Vous n'avez pas à enregistrer le fichier entier dans la mémoire.

EDIT: Je suis terriblement désolé, je pensais que la question portait sur la programmation C#. Mon erreur - désolé.

+3

mondiale ne met pas fin à des technologies de Micro $ oft ;-) ;-) ;-) – kyku

+0

@MykolaGolubyev Pas même faux: tout simplement pas une réponse du tout. :) –

2

Vous pouvez faire une macro:

qa (faire une macro et le stocker dans le registre a).

« Rye (Yank à la fin du mot et l'ajouter à enregistrer r - des moyens de capital append, écrasez minuscule.)

n (prochain match)

q (enregistrement final)

Si il y a 10 matches, ne 10 @ un Assurez-vous r registre est vide lorsque vous commencez.

+0

oublié d'ajouter /: \ w + à l'algorithme commence. –

1

Ajoutez ceci à votre .vimrc ou de créer un fichier dans le dossier plugin vim avec le contenu suivant.
Après avoir exécuté ces lignes via .vimrc ou plugin, utilisez la commande: CopyTextAfterColon, puis insérez simplement à partir du texte du tampon système dont vous avez besoin.

function! s:copy_after_colon() 
    let values = '' 

    let pattern = '^.*:\(\w\+\).*$' 

    for line_number in range(1, line('$')) 
     let line = getline(line_number) 
     if line =~ pattern 
      let value = substitute(line, pattern, '\1', '') 
      let values .= value."\n" 
     endif 
    endfor 

    let @* = values 
endfunction 

command! -nargs=0 CopyTextAfterColon call <SID>copy_after_colon() 

Vous pouvez l'adapter plus tard à différentes fins.

Questions connexes