11

我正在尝试使用bash脚本将包含表格的 HTML 转换为 .csv 文件。

到目前为止,我已经完成了以下步骤:

  1. 转换为 Unix 格式(带dos2unix
  2. 删除所有空格和制表符(带sed 's/[ \t]//g'
  3. 删除所有空行(带sed ':a;N;$!ba;s/\n//g')(这是必要的,因为 HTML 文件的每个单元格都有一个空行...这不是我的错)
  4. 删除不必要的<td> 标签<tr>(带sed 's/<t.>//g'
  5. 替换</td>为 ',' (with sed 's/<\/td/,/g')
  6. 替换</tr>为行尾 ( \n) 字符 (with sed 's/<\/tr/\n/g')

当然,我将所有这些都放在了管道中。到目前为止,它工作得很好。我坚持最后一步:表格有一列包含日期,格式dd/mm/yyyy为 ,我想将它们转换为yyyy-mm-dd.

有(简单的)方法(使用sedor awk)吗?

数据样本(在整个sed管道之后):

500,2,13/09/2007,30000.00,12,B-1
501,2,15/09/2007,14000.00,8,B-2

预期结果

500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2

我需要这样做的原因是因为我需要将此数据导入 MySQL。我可以在 Excel 中打开文件并手动更改格式,但我想跳过它。

4

6 回答 6

11
sed -E 's,([0-9]{2})/([0-9]{2})/([0-9]{4}),\3-\2-\1,g'
于 2013-08-26T21:25:31.260 回答
11

Awk可以很容易地完成这项任务:

awk '
    BEGIN { FS = OFS = "," } 
    { split($3, date, /\//)
      $3 = date[3] "-" date[2] "-" date[1]
      print $0 
    }
' infile

它产生:

500,2,2007-09-13,30000.00,12,B-1
501,2,2007-09-15,14000.00,8,B-2
于 2013-08-26T21:18:30.587 回答
5

awk将为此工作:

echo 08/26/2013 | awk -F/ '{printf "%s-%s-%s\n",$3,$2,$1}'

与这些bash-only 选项之一一样:

IFS=/ read m d y < <(echo 08/26/2013); echo "${y}-${m}-${d}"
IFS=/ read m d y <<< "08/26/2013"; echo "${y}-${m}-${d}"

如果您碰巧使用ksh,其中子shell 不用于管道的最后一个组件,这应该也可以:

echo 08/26/2013 | IFS=/ read m d y; echo "${y}-${m}-${d}"

最近bash,您还可以shopt -s lastpipe在脚本中使用以使上述调用也能正常工作,但它不能在命令行上工作(感谢下面评论中的@mklement0)。

我将由您来决定如何将其与其余部分集成...

于 2013-08-26T21:19:06.520 回答
5
sed "s:,\([0-9]\+\)/\([0-9]\+\)/\([0-9]\+\),:,\3-\2-\1,:"
于 2013-08-26T21:14:19.003 回答
4

到目前为止,所有答案都是针对 OP 问题的特定案例。这是一种更通用的方法,通过以下方式运行(GNU,用于-d选项) :dateawk

awk 'BEGIN{FS=","}
     {
       "date -d\"" $3 "\" +%Y-%m-%d" | getline mydate; 
       print $1 "," $2 "," mydate "," $4 "," $5 "," $6
     }'

当然,这种方法只有在输入日期格式由date. 不幸的是,AFAICS 并非如此dd/mm/yyyy。可以尝试除(未测试)以外的其他命令。date

编辑:实施 mklement0 的评论。

Edit2:实际上这不适mawk用于 Debian 的默认awk实现。明显的解决方案是尽可能安装gawk

于 2016-03-16T12:10:14.293 回答
2

对 awk 的更正假设您寻求 yyyy-mm-dd(不是 yyyy-dd-mm)

回声 2013 年 8 月 26 日 | awk -F/ '{printf "%s-%s-%s\n",$3,$1,$2}'

于 2014-04-02T13:39:54.677 回答