2012-01-04 17 views
8

Ho molte celle che vorrei convertire in modo tale che la prima lettera in ogni cella sia in maiuscolo. Per esempio. cook, chef, fireman diventa Cook, Chef, Fireman.Cambia maiuscole della prima lettera in ogni cella nel foglio di calcolo

  • Ho il foglio di calcolo in OpenOffice.org, ma sembra avere solo le opzioni per "tutto maiuscolo" o "tutto minuscolo".
  • Posso modificarlo in OpenOffice.org o esportarlo in un CSV e modificare il CSV con uno script BASH, se OpenOffice.org non può farlo.

Come posso modificare la prima lettera di ogni cella del foglio di calcolo in maiuscolo?

risposta

3

Ho uno script awk che farà ciò che vuoi (penso).

Ecco la mia prova gli input (test.input):

cook, chef, fireman 
cook, chef, fireman 
cook, chef, fireman 
cook, chef, fireman 
house, farm, road 

Il mio script awk (up.awk):

# from: http://www.gnu.org/software/gawk/manual/html_node/Join-Function.html 
function join(array, start, end, sep, result, i){ 
     if (sep == "") 
      sep = " " 
     else if (sep == SUBSEP) # magic value 
      sep = "" 
     result = array[start] 
     for (i = start + 1; i <= end; i++) 
      result = result sep array[i] 
     return result 
} 
BEGIN { 
    FS="\n"; 
} 
{ 
    # split input on newline 
    for(i=1;i<=NF;i++) { 
     # split line on the commas 
     size = split($i, s, ",") 
     for(ii=1;ii<=size;ii++) { 
      # trim whitespace 
      gsub(/[[:space:]]*/,"",s[ii]) 
      # uppercase first char and glue it back together 
      s[ii] = toupper(substr(s[ii], 0, 1)) substr(s[ii], 2) 
     } 
     # join array back and print it out 
     print join(s, 1, size, ", ") 
    } 
} 

Come faccio funzionare lo scritto:

L'output nel mio test.output:

Cook, Chef, Fireman 
Cook, Chef, Fireman 
Cook, Chef, Fireman 
Cook, Chef, Fireman 
House, Farm, Road 
+0

Quando eseguo lo script, cancella semplicemente "a", "e" e "i" dal file. – Village

+0

@Village se potessi pubblicare le righe del file csv in questione, sarebbe utile, prima e dopo. Inoltre, è possibile che ci siano delle differenze nelle versioni di awk. Sono in esecuzione "versione awk 20070501". – Dennis

+0

Ho usato il tuo file CSV. Cambia in: "ok, hf, fermato". – Village

2

si potrebbe fare qualcosa di abbastanza rischioso con Python o qualsiasi altra lingua.

#!/usr/bin/env python 

lastchar = "" 
orig_csv = open("yourfile.csv", "r") 
new_csv = open("newfile.csv", "w") 
for line in orig_csv: 
    for char in line: 
     if lastchar == ",": 
      new_csv.write(char.upper()) 
     else: 
      new_csv.write(char) 
orig_csv.close() 
new_csv.close() 

Questo presuppone che nessuno dei campi sono racchiusi tra virgolette, perché sarà solo upcase tutto dopo una virgola.

In caso contrario, si vorrà effettivamente utilizzare una libreria CSV.

+0

Lo script non sembra funzionare. È solo per Python 3? – Village

+0

Quale parte non funziona? In tutta onestà, è completamente non testato. L'ho appena tirato fuori dalla cima della mia testa. – richo

7

Forse hai solo bisogno di aggiornare ad una versione più recente. Sto usando LibreOffice 3.4.4 e vedo Format -> Change Case -> Sentence case che direi fa esattamente quello che ti serve.

6

Perl è un'opzione? C'è un modulo nell'archivio CPAN chiamato Spreadsheet::WriteExcel che può anche gestire fogli di calcolo di OpenOffice.

Che, fondamentalmente, leggere nel foglio di calcolo, la ricerca di cellule, modificare quelli che si desidera, e il creare un nuovo foglio di calcolocon i dati modificati. Non è possibile modificare direttamente un foglio di calcolo di Excel. Non so se questo si applica ai documenti di OpenOffice.

L'ho usato prima per leggere e scrivere fogli di calcolo Excel, ma è stato qualche tempo fa. Tuttavia, questo modulo può gestire la situazione senza dover prima salvare il foglio di calcolo in formato CSV.

+0

Perl andrebbe bene. – Village

2

Se si utilizza, o se si aggiorna a, OOo 3.3 ci sono opzioni per questo built-in.
Contrassegnare tutte le celle che si desidera influenzare, quindi scegliere Format -> Change Case -> Sentence case e voilà! Vedi se questo è il trucco per te?

8

Mi capita di fare questo compito. È necessario installare i moduli Spreadsheet::ParseExcel e Spreadsheet::WriteExcel.

use strict; 
use warnings; 

use Spreadsheet::ParseExcel::SaveParser; 

my $parser = Spreadsheet::ParseExcel::SaveParser->new(); 
my $workbook = $parser->Parse('Book1.xls'); 

if (!defined $workbook) { 
    die $parser->error(), ".\n"; 
} 

for my $worksheet ($workbook->worksheets()) { 

    my ($row_min, $row_max) = $worksheet->row_range(); 
    my ($col_min, $col_max) = $worksheet->col_range(); 

    for my $row ($row_min .. $row_max) { 
     for my $col ($col_min .. $col_max) { 

      my $cell = $worksheet->get_cell($row, $col); 
      next unless $cell; 

      # "ucfirst lc" make sure that only the first letter is capitalized 
      # if you dont like that just remove lc 
      $worksheet->AddCell($row, $col, ucfirst lc $cell->value()); 

     } 
    } 
} 

# ofcouse save your work 
$workbook->SaveAs('Book2.xls'); 
+0

Ho consigliato questi moduli, ma tu hai dato l'esempio. –

1

Esportarlo come csv. Quindi fai qualcosa di simile.

#psuedo python 
out="" 
nums = [col numbers to capitalize] 
for line in file.read_csv('input.csv'): 
    for n in nums: 
     line[n] = line[n].capitalize() 
     out += ",".join(line) + "\n" 
1

È possibile scrivere una piccola gawk e sed combinata per ottenere il titolo caso -

gawk -v RS="[,\n]" -v ORS="" ' 
{a=substr($1,1,1); b=substr($1,2); print toupper(a)b" "; if (NR%3==0) print "\n"}' file | 
sed -e 's/ /, /g' -e 's/, *$//' 

prova:

[jaypal:~/Temp] cat file 
cook, chef, fireman 
cook, chef, fireman 
cook, chef, fireman 
cook, chef, fireman 
house, farm, road 

[jaypal:~/Temp] gawk -v RS="[,\n]" -v ORS="" ' 
{a=substr($1,1,1); b=substr($1,2); print toupper(a)b" "; if (NR%3==0) print "\n"}' file | 
sed -e 's/ /, /g' -e 's/, *$//' 
Cook, Chef, Fireman 
Cook, Chef, Fireman 
Cook, Chef, Fireman 
Cook, Chef, Fireman 
House, Farm, Road 

Ovviamente questo non è la soluzione perfetta, è potrebbe essere necessario modificarlo un po 'a seconda di quante righe di dati hai o vuoi. Le modifiche a NR%3 dovrebbero essere sufficienti.

1

Questo potrebbe funzionare per voi:

cat <<! | sed 's/\<[^,]*/\u&/g' 
> cook, chef, fireman 
> head cook, head chef, chief fireman 
> house, farm, road 
> ! 
Cook, Chef, Fireman 
Head cook, Head chef, Chief fireman 
House, Farm, Road 

Probabilmente GNU sed specifica.

3

Perl one-liner:

perl -pwe 's/(?:^|,)\s*\K([a-z])/\U$1/g;' file.csv > fileout.csv 

È inoltre possibile utilizzare modifica locale con lo switch -i. Per esempio. perl -pi.bak -we ...

Versione più lunga, utilizzando Text::CSV_XS. Questo modulo tratterà (probabilmente) i tuoi file CSV con maggiore attenzione.

use strict; 
use warnings; 
use Text::CSV_XS; 

my $csv = Text::CSV_XS->new({ 
     binary => 1, 
     eol  => $/, 
    }); 

my $file = shift; 
open my $fh, '<', $file or die $!; 
while (my $row = $csv->getline($fh)) { 
    s/([a-z])/\U$1/ for @$row; 
    $csv->print (*STDOUT, $row); 
} 

Run con: perl script.pl file.csv > fileout.csv

Problemi correlati