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

Posted

技术标签:

【中文标题】更改电子表格中每个单元格中第一个字母的大小写【英文标题】:Change case of first letter in every cell in spreadsheet 【发布时间】:2012-02-01 23:36:52 【问题描述】:

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

我在 OpenOffice.org 中有电子表格,但它似乎只有“全大写”或“全小写”选项。 如果 OpenOffice.org 无法执行此操作,我可以在 OpenOffice.org 中编辑它或导出到 CSV 并使用 BASH 脚本编辑 CSV。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我推荐了这些模块,但你给出了例子。【参考方案2】:

也许您只需要更新到更新的版本。我正在使用 LibreOffice 3.4.4,我看到 Format -> Change Case -> Sentence case 正是您需要的。

【讨论】:

【参考方案3】:

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

您基本上是在电子表格中阅读、搜索单元格、修改您想要的单元格,然后使用修改后的数据创建一个 电子表格。您不能直接修改 Excel 电子表格。我不知道这是否适用于 OpenOffice 文档。

我以前用它来读写 Excel 电子表格,但那是不久前的事了。但是,此模块可以处理您的情况,而无需先将电子表格保存为 CSV 格式。

【讨论】:

【参考方案4】:

我有一个 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 &gt;test.output

我的 test.output 中的输出:

Cook, Chef, Fireman
Cook, Chef, Fireman
Cook, Chef, Fireman
Cook, Chef, Fireman
House, Farm, Road

【讨论】:

当我运行脚本时,它只是从文件中删除“a”、“e”和“i”。 @Village 如果您可以发布有问题的 csv 文件的行,那么在之前和之后都会有所帮助。此外,awk 版本可能存在一些差异。我正在运行“awk 版本 20070501”。 我使用了您的 CSV 文件。它变为:“ok,hf,firmn”。 您可能在 ubuntu 上,您可以执行“sudo apt-get install gawk”。然后改用 gawk。【参考方案5】:

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 &gt; fileout.csv

【讨论】:

【参考方案6】:

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

【讨论】:

哪一部分不起作用?公平地说,它完全未经测试。我只是把它从头顶上砸下来。【参考方案7】:

如果您正在使用或升级到 OOo 3.3,则有内置选项可供选择。 标记您想要影响的所有单元格,然后选择Format -&gt; Change Case -&gt; Sentence case 和瞧!看看这对你有用吗?

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

您可以编写一个小的 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 的更改应该已经足够好了。

【讨论】:

【参考方案10】:

这可能对你有用:

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 特有的。

【讨论】:

以上是关于更改电子表格中每个单元格中第一个字母的大小写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?

此单元格复制电子表格中该单元格中的图像?

基于Web的JavaScript电子表格

从Google电子表格单元格中解析Json

如何从谷歌电子表格中动态变化的单元格中保存最小值和最大值?

电子表格那个对角线怎么打出来??