Изменить регистр первой буквы в каждой ячейке таблицы - PullRequest
8 голосов
/ 04 января 2012

У меня есть много ячеек, которые я хотел бы преобразовать так, чтобы первая буква в каждой ячейке была заглавной.Например, cook, chef, fireman становится Cook, Chef, Fireman.

  • У меня есть электронная таблица в OpenOffice.org, но, похоже, есть только опции для «все прописные» или «все строчные».* Я могу отредактировать его в OpenOffice.org или экспортировать в CSV и отредактировать CSV с помощью скрипта BASH, если OpenOffice.org не может сделать это.в таблице в верхнем регистре?

Ответы [ 10 ]

8 голосов
/ 04 января 2012

Я случайно выполнил эту задачу.Вам необходимо установить Spreadsheet :: ParseExcel и 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');
7 голосов
/ 04 января 2012

Может быть, вам просто нужно обновить версию. Я использую LibreOffice 3.4.4 и вижу Format -> Change Case -> Sentence case, который, я бы сказал, делает именно то, что вам нужно.

6 голосов
/ 04 января 2012

Является ли Perl опцией?В архиве CPAN есть модуль Spreadsheet :: WriteExcel , который также может обрабатывать электронные таблицы OpenOffice.

Вы в основном читаете в электронной таблице, ищите ячейки, изменяете те, которые хотите, исоздать электронную таблицу новая с измененными данными.Вы не можете напрямую изменить электронную таблицу Excel.Я не знаю, относится ли это к документам OpenOffice.

Я использовал это раньше для чтения и записи таблиц Excel, но это было довольно давно.Однако этот модуль может справиться с вашей ситуацией без предварительного сохранения таблицы в формате CSV.

3 голосов
/ 04 января 2012

Perl однострочный:

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

Вы также можете использовать редактирование на месте с помощью переключателя -i. Например. perl -pi.bak -we ...

Более длинная версия, с использованием Text :: CSV_XS . Этот модуль (вероятно) будет обрабатывать ваши CSV-файлы с большей осторожностью.

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);
}

Запустите его с: perl script.pl file.csv > fileout.csv

3 голосов
/ 04 января 2012

У меня есть скрипт awk, который будет делать то, что вы хотите (я думаю).

Вот мой тестовый ввод (test.input):

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

Мой скрипт awk (вверх.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, ", ")
    }
}

Как запустить скрипт: awk -f up.awk test.input >test.output

Вывод в моем test.output:

Cook, Chef, Fireman
Cook, Chef, Fireman
Cook, Chef, Fireman
Cook, Chef, Fireman
House, Farm, Road
2 голосов
/ 04 января 2012

Если вы используете, или если вы обновляетесь до, OOo 3.3 есть опции для этого встроенного. Отметьте все ячейки, на которые хотите повлиять, затем выберите Format -> Change Case -> Sentence case и вуаля! Посмотри, подходит ли тебе этот трюк?

2 голосов
/ 04 января 2012

вы могли бы сделать что-то довольно хитроумное с python или любым другим языком.

#!/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()

Это предполагает, что ни одно из полей не заключено в кавычки, потому что это только запутает все после запятой.

В противном случае вы захотите использовать библиотеку CSV.

1 голос
/ 04 января 2012

Это может сработать для вас:

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

Вероятно, GNU sed специфично.

1 голос
/ 04 января 2012

Вы можете написать небольшую комбинацию gawk и sed, чтобы получить регистр заголовков -

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/, *$//'

Тест:

[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

Очевидно, этоэто не идеальное решение, вам, возможно, придется немного его настроить в зависимости от того, сколько строк данных у вас есть или вы хотите.Изменения в NR%3 должны быть достаточно хорошими.

1 голос
/ 04 января 2012

Экспорт в формате CSV. Затем сделайте что-то вроде этого.

#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"
...