【问题标题】:Enclosing a block of text in quotation marks (or any other couple of chars) in a csv在 csv 中将一段文本用引号(或任何其他几个字符)括起来
【发布时间】:2019-05-28 17:02:29
【问题描述】:

我有一个 .csv 文件,我需要执行以下操作:对于 每一行,从该行的 end 开始,出现在指定字符出现一定次数时应括在引号中。

我会试着用一个例子让自己更清楚。考虑以下 csv 行:

gentlemen, this is a block of text. Thanks!,1,0,0,1

我想将出现的行的片段括在引号中,从末尾开始,在第四次出现逗号之后。所以,它应该变成:

"gentlemen, this is a block of text. Thanks!",1,0,0,1

我想用 bash、pure python 或 pandas 来做。

【问题讨论】:

  • 这在纯 python 中很容易。只需从列表末尾向下循环,直到满足您的条件,跟踪索引。剩下的只是切片。你可以想办法!
  • 这个问题可能实际上应该被标记为重复;第一个问题不能是问“我如何在字符串 [before|after] Y number of Z, [forwards|backwards] 中匹配 X。”此外,人们可以通过循环,直到发现正则表达式,然后意识到正则表达式是程序员工具包的预期部分。向下按钮上的文字是:“这个问题没有显示任何研究工作:不清楚或没有用。”这不是侮辱。 Asking good SO questions is hard。 99% 的用户真的应该只是用谷歌搜索过。

标签: python bash pandas csv text


【解决方案1】:

使用 sed:

$ sed -E 's/(.*)((,.*){4})/"\1"\2/' <<< 'gentlemen, this is a block of text. Thanks!,1,0,0,1'
"gentlemen, this is a block of text. Thanks!",1,0,0,1

这使用两个捕获组。重要的部分是(,.*){4}:这是四个逗号后跟任何内容的实例。因为第一组贪婪匹配,所以第二组会匹配最后四个逗号。

然后替换在第一组周围加上双引号并打印第二组未修改。

【讨论】:

    【解决方案2】:

    在python中:

    line = r'gentlemen, this is a block of text. Thanks!,1,0,0,1'
    num_commas = 4
    comma_count = 0
    for c in reversed(line):
        from_end += 1
        if c == ',':
            comma_count += 1
        if comma_count >= num_commas:
            break
    line[:-from_end]
    # 'gentlemen, this is a block of text. Thanks!'
    

    其余的都是学术性的。

    【讨论】:

      【解决方案3】:
      In [1]: line = r'gentlemen, this is a block of text. Thanks!,1,0,0,1'
         ...: a,b,c,d,*e = line[::-1].split(",")
         ...: print((','.join([a,b,c,d])[::-1] + "," + "'" + ','.join(e) + "'")[::-1])
         ...: 
      'gentlemen, this is a block of text. Thanks!',1,0,0,1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-20
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        相关资源
        最近更新 更多