首页 文章

更改电子表格中每个单元格中首字母的大小写

提问于
浏览
8

我有许多单元格,我想转换,以便每个单元格中的第一个字母大写 . 例如 . cook, chef, fireman 变为 Cook, Chef, Fireman .

  • 我在OpenOffice.org中有电子表格,但它似乎只有"all uppercase"或"all lowercase"的选项 .

  • 如果OpenOffice.org无法执行此操作,我可以在OpenOffice.org中编辑它或导出为CSV并使用BASH脚本编辑CSV .

如何将电子表格中每个单元格的第一个字母更改为大写?

10 回答

  • 2

    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

  • 7

    我有一个awk脚本可以做你想要的(我想) .

    这是我的test intput(test.input):

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

    我的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, ", ")
        }
    }
    

    我如何运行脚本: 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
    
  • 6

    这可能对你有用:

    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

    将其导出为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"
    
  • 3

    也许你只需要更新一个版本 . 我正在使用LibreOffice 3.4.4,我看到了 Format -> Change Case -> Sentence case ,我说这正是你所需要的 .

  • 2

    如果您正在使用,或者升级到OOo 3.3,则可以使用此选项 .
    标记您想要影响的所有单元格,然后选择 Format -> Change Case -> Sentence case 并瞧!看看这对你有用吗?

  • 3

    你可以写一个小的 gawksed 组合来获得 Headers 案例 -

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

    Test:

    [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 的更改应该足够好了 .

  • 8

    Perl是一个选择吗? CPAN存档中有一个名为Spreadsheet::WriteExcel的模块,它也可以处理OpenOffice电子表格 .

    您基本上是在电子表格中读取,搜索单元格,修改所需的单元格,然后使用修改后的数据创建 new 电子表格 . 您无法直接修改Excel电子表格 . 我不知道这是否适用于OpenOffice文档 .

    我之前用过这个来读写Excel电子表格,但那是不久之前 . 但是,此模块可以处理您的情况,而无需先以CSV格式保存电子表格 .

  • 1

    你可以用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

    我碰巧做了这个任务 . 您必须安装Spreadsheet::ParseExcelSpreadsheet::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');
    

相关问题