【问题标题】:split text with fields and text delimiters使用字段和文本分隔符拆分文本
【发布时间】:2018-09-10 07:13:00
【问题描述】:

示例行:

"1","Point 1","value1,value2,value3","value1: funtion1**\n**value2: function2","UUID=12345","description"

我要提取第 1 列、第 2 列和第 5 列。

  • 我不能使用逗号,因为 col3 有多个逗号。
  • 第 4 列包含多个新行\n,因此无法到达第 5 列(UUID)。

我们可以通过用excel打开一个csv文件来实现,只需要选择字段分隔符和文本分隔符。脚本可以吗?

您可以使用this link下载文件。

【问题讨论】:

  • 您可以发布您的 CSV 文件吗?而示例行是一个列表还是一个字符串对象?
  • 你不能用 python csv 模块做吗?
  • 我查看了之前和提到的文章。关于这个问题的uniq 很少有:多个逗号、多个换行符和文本分隔符,这些在任何文章中都不存在。为了清楚地理解问题,请检查提到的链接并在 excel 中打开一个 csv 文件。它是一条线。

标签: python linux shell scripting grep


【解决方案1】:

如果示例行是一个字符串。下面的 sn-p 应该会有所帮助。

s = """"1","Point 1","value1,value2,value3","value1: funtion1**\n**value2: function2","UUID=12345","description"
I """

val = [i.strip('"') for i in s.split('","')]
print(val)
print(val[4])     #use index to get element

输出:

['1', 'Point 1', 'value1,value2,value3', 'value1: funtion1**\n**value2: function2', 'UUID=12345', 'description"\nI ']
UUID=12345

【讨论】:

    【解决方案2】:

    注意:此解决方案很简单,但高度依赖于格式是否一致。 假设引号和逗号之间没有空格,您可以用"," 分隔它们:

    #input string
    s = '"1","Point 1","value1,value2,value3","value1: funtion1**\n**value2: function2","UUID=12345","description"' 
    
    # remove quotation marks and whitespace from edges, then split string into tuple
    cols = s.strip('" ').split('","') 
    

    现在您可以提取列,例如第 5 列是cols[4]

    >> cols[4]
    'UUID=12345'     
    

    【讨论】:

      【解决方案3】:

      如果我理解正确,请使用以下 python:

      import csv
      with open('/tmp/test.csv', 'r') as csvfile:
           reader = csv.reader(csvfile, delimiter=',', quotechar='"')
           for row in reader:
               for i, cell in enumerate(row):
                  print("Cell %d: %s" % (i, cell))
      

      无论它们是否包含分隔符或新行,您都可以获取每一列。输出:

      Cell 0: 1
      Cell 1: Point 1
      Cell 2: value1,value2,value3
      Cell 3: value1: funtion1**\n**value2: function2
      Cell 4: UUID=12345
      Cell 5: description
      

      现在,我打开您链接的 xlsx 并使用 LibreOffice 保存为 csv,代码处理新行:

      Cell 0: 1
      Cell 1: point1
      Cell 2: value1, value2,value3
      Cell 3: Line1
      
      Line2.
      
      Line3.
      Cell 4: UUID=123545
      time=123seconds
      
      Start time: x
      
      End time: y
      Cell 5: 1234
      

      原始 csv 内容是(请注意,尽管它们代表单个 ,但它们实际上跨越文件中的多个 ):

      1,point1,"value1, value2,value3","Line1
      
      Line2.
      
      Line3.","UUID=123545
      time=123seconds
      
      Start time: x
      
      End time: y",1234
      

      让我知道上面的 sn-p 是否可以处理您的数据,但如果它们确实是 CSV 格式,它应该能够正确读取单元格

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-18
        相关资源
        最近更新 更多