douju5062 2015-01-19 09:01
浏览 57
已采纳

使用golang正则表达式获取xlsx单元格数据?

I use the regexp expression to get the data from .xlsx file. but i am poor and a newer in regexp. Anyone could help me?

package main

import (
        "fmt"
        "regexp"
)

func main() {
        input := `
        <sheetData>
        <row r="2" spans="1:15">
        <c r="A2" s="5" ><v>{{range .txt}}</v></c>
        <c r="B2" s="5" t="s"><v>1</v></c>
        <c r="C2" s="5" t="s"><v>2</v></c>
        <c r="D2" s="5" t="s"><v>3</v></c>
        <c r="E2" s="5" />
        <c r="K2" s="6" t="s"><v>21</v></c>
    </row> 
    <row r="3" spans="1:15">
        <c r="A3" s="5" t="s"><v>0</v></c>
        <c r="B3" s="5" t="s"><v>1</v></c>
        <c r="C3" s="5" t="s"><v>2</v></c>
        <c r="D3" s="5" t="s"><v>3</v></c>
        <c r="E3" s="5" />
        <c r="K3" s="6" t="s"><v>21</v></c>
    </row> 
    </sheetData>`
        r := regexp.MustCompile(`<row[^>]*?r="(\d+)"[^>].*?>.*?[(<v>(.*?)<\/v>.*?)]<\/row>`)
        r2 := regexp.MustCompile(`<v>(.*?)</v>`)
        row:=r.FindAllString(input,-1)
        for _,v:=range row {
        fmt.Println(r.ReplaceAllStringFunc(v, func(m string) string {
               match:=r2.FindAllString(v,-1)
            for kk,vv:=range match {
            fmt.Println(kk,vv)
             fmt.Println(r2.ReplaceAllString(v, ""))             
        }  
      }))
        }
    }   

Question:

  1. How to get the string {{range .txt}} ,and throw off the tag"..."

  2. How to get the "3" from r="3" ,and get the "A3,B3,C3..." from the "

Thanks in advance!

  • 写回答

1条回答 默认 最新

  • duanmingting9544 2015-01-19 09:23
    关注

    I think regexp is the wrong tool for this job. Try xml:

    import "encoding/xml"
    
    // Could probably pick better names for these.
    type C struct {
        XMLName xml.Name `xml:"c"`
        V       string   `xml:"v"`
        R       string   `xml:"r,attr"`
    }
    type Row struct {
        XMLName xml.Name `xml:"row"`
        C       []C      `xml:"c"`
    }
    type Result struct {
        XMLName xml.Name `xml:"sheetData"`
        Row     []Row    `xml:"row"`
    }
    v := Result{}
    
    err := xml.Unmarshal([]byte(input), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    for _, r := range v.Row {
        for _, c := range r.C {
            fmt.Printf("%v %v
    ", c.V, c.R)
        }
    }
    

    This will print:

    {{range .txt}} A2
    1 B2
    2 C2
    3 D2
    ...
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog