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

8

我有很多单元格需要转换,使每个单元格中的第一个字母大写。例如:cook, chef, fireman 变成 Cook, Chef, Fireman

  • 我使用OpenOffice.org创建了电子表格,但是似乎只有“全部大写”或“全部小写”的选项。
  • 如果OpenOffice.org无法实现,我可以在OpenOffice.org中编辑或将其导出为CSV,并使用BASH脚本编辑CSV。

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

10个回答

8

我刚好可以做这个任务。您需要安装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');

我推荐了这些模块,但你举了例子。 - David W.

7
也许你只需要更新到更高版本。我正在使用LibreOffice 3.4.4,我看到格式 -> 更改大小写 -> 句子首字母大写,这正是你所需要的。

6
Perl是一个选项吗?CPAN档案中有一个模块叫做“Spreadsheet::WriteExcel”(链接:http://search.cpan.org/~jmcnamara/Spreadsheet-WriteExcel-2.37/lib/Spreadsheet/WriteExcel.pm),也可以处理OpenOffice电子表格。你基本上需要读取电子表格,搜索单元格,修改所需的单元格,然后创建一个包含修改数据的电子表格。你不能直接修改Excel电子表格。我不知道这是否适用于OpenOffice文档。我以前用过它来读写Excel电子表格,但那是一段时间之前的事了。但是,该模块可以处理你的情况,无需先将电子表格保存为CSV格式。

3

我有一份awk脚本可以完成你想做的事情(我认为是这样)。

这是我的测试输入(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

当我运行脚本时,它只是从文件中删除"a"、"e"和"i"。 - Village
@Village 如果您能够在问题中发布csv文件的行,那将非常有帮助,包括之前和之后的内容。此外,可能awk版本存在一些差异。我正在运行“awk version 20070501”。 - Dennis
我已经使用了你的CSV文件。它变成了:"ok,hf,firmn"。 - Village
你可能正在使用Ubuntu,可以执行“sudo apt-get install gawk”命令进行安装。然后使用gawk代替原来的工具。 - Dennis

3

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 脚本名.pl 文件名.csv > 输出文件名.csv

2
如果您正在使用或升级到OOo 3.3,则内置了此选项。
标记要更改的所有单元格,然后选择格式 -> 更改大小写 -> 句子大小写,完成!看看是否解决了您的问题?

2

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

哪一部分不起作用?公平地说,它完全没有经过测试。我只是凭想象随意编写的。 - richo

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"

1

你可以编写一个小的 gawksed 组合来获取标题大小写 -

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

这个可能适合你:

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。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接