首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TSV转换为CSV,其中TSV字段中包含逗号

将TSV转换为CSV,其中TSV字段中包含逗号
EN

Stack Overflow用户
提问于 2019-05-28 20:15:35
回答 4查看 318关注 0票数 0

我有一个带有字段的TSV,如下所示:

代码语言:javascript
复制
name   location   1,2,3,4,5

当我使用sed 's/\w/,/g'时,我最终得到了csv,其中1、2、3、4和5被认为是独立的入口。我希望它是'1 2 3 4 5',在运行上面的命令之前,我已经尝试过将逗号转换为空格,使用以下命令

代码语言:javascript
复制
sed 's/,/\w/g' 

但是,当将空格转换回逗号时,它包括单个空格和制表符,那么单个空格字符的正则表达式是什么呢?

所需输出:

代码语言:javascript
复制
name, location,1 2 3 4 5,
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-28 20:29:29

正如在注释中提到的,CSV通常通过将值括在引号中来处理其分隔符在值中的出现,因此我建议您只需将每个值括在引号中即可解决此问题:

代码语言:javascript
复制
sed -E 's/([^\t]*)(\t|$)/"\1",/g'

你可以使用try it here

这将在您的示例输出中留下一个尾随逗号,如果您想要避免它,您可以使用以下命令:

代码语言:javascript
复制
sed -E 's/\t+$//;s/^/"/;s/\t/","/g;s/$/"/'

但是,如果您的原始数据包含",则需要对它们进行转义,您可以通过在其他数据之前添加以下替换来实现:

代码语言:javascript
复制
s/"/\\"/g

正如Ed Morton建议的那样,我们还可以剥离尾随的空字段:

代码语言:javascript
复制
s/\t+$//

总之,我将使用以下内容:

代码语言:javascript
复制
sed -E 's/"/\\"/g;s/\t+$//;s/^/"/;s/\t/","/g;s/$/"/'

你可以试试here

票数 2
EN

Stack Overflow用户

发布于 2019-05-28 20:33:08

将制表符替换为","并用双引号括起行,或者将逗号替换为空格,将制表符替换为逗号。在这两种情况下,您都将获得有效的CSV。

代码语言:javascript
复制
$ cat file
name    location        1,2,3,4,5
$
$ sed 's/\t/","/g; s/^\|$/"/g' file
"name","location","1,2,3,4,5"
$
$ sed 's/,/ /g; s/\t/,/g' file
name,location,1 2 3 4 5
票数 1
EN

Stack Overflow用户

发布于 2019-05-28 20:38:33

在awk中:

代码语言:javascript
复制
$ awk -v OFS="," '{for(i=1;i<=NF;i++)if($i~/,/)$i="\"" $i "\"";$1=$1}1' file
name,location,"1,2,3,4,5"

解释:

代码语言:javascript
复制
$ awk -v OFS="," '{          # output delimiter to a comma *
    for(i=1;i<=NF;i++)       # loop all fields
        if($i~/,/)           # if comma in field
            $i="\"" $i "\""  # surround with quotes **
    $1=$1                    # rebuild record
}1' file                     # output

*如果记录中有空格,请考虑使用awk -F"\t"将字段分隔符输入到制表符。

**此外,如果字段中有带逗号的引号,则可能需要重复或转义它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56342068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档