【问题标题】:Delimiting a series of txt's and putting it into a csv or database分隔一系列 txt 并将其放入 csv 或数据库
【发布时间】:2013-11-27 21:40:54
【问题描述】:

我相信有人会知道如何解决这个问题。我有一个宠物项目,我正在尝试从以下几个 txt 构建数据库。记录按每 6 行(空白的)分割。字段被连续的空格和五行的末尾分开,形成一条记录。有些字段确实有空格。

我已经尝试过 DataStage 和 SPSS - 但似乎无法安静地得到结果。我也尝试过 Altova Mapforce,它让我很接近。我选择的数据库可能是 MySQL(鉴于这是我业余时间的项目)

SUNCOR ET AL MEDHAT 9-17-15-4        0416613   ALBERTA CROWN        753.3M                          
100/09-17-015-04W4/00  S  543.4M  W  167.6M    MEDICINE HAT         656.8M                        
DEV (NC)                             MEDICINE HAT                   FISH SCALE ZONE                 
VERTICAL                             NEW       PRODUCTION           GAS                             
SUNCOR ENERGY INC.                                                  09-17-015-04W4                  

CVE HOUSE 3-23-83-17                 0416614   ALBERTA CROWN        536.17M                         
1AB/03-23-083-17W4/00  N  281.3M  E  686.8M    BONNYVILLE           283.7M                       
OV (C)                               HOUSE                          MCMURRAY FM                     
VERTICAL                             NEW       OIL SAND EVALUATION  CRUDE BITUMEN                   
CENOVUS ENERGY INC.                                                 03-23-083-17W4                  

CVE GRANOR 11-27-82-18               0416615   ALBERTA CROWN        554.69M                         
1AA/11-27-082-18W4/00  S  756.7M  E  677.6M    BONNYVILLE           409.2M                        
OV (C)                               GRANOR                         GROSMONT FM                     
VERTICAL                             NEW       OIL SAND EVALUATION  CRUDE BITUMEN                   
CENOVUS ENERGY INC.                                                 11-27-082-18W4                  

SUNCOR ET AL MEDHAT 4-17-15-4        0416616   ALBERTA CROWN        750.9M                          
100/04-17-015-04W4/00  N  320.1M  E  317.1M    MEDICINE HAT         646.4M                        
DEV (NC)                             MEDICINE HAT                   FISH SCALE ZONE                 
VERTICAL                             NEW       PRODUCTION           GAS                             
SUNCOR ENERGY INC. 

                                             04-17-015-04W4 

某些字段确实包含单个空格,但从不包含多个连续空格。

【问题讨论】:

  • 这看起来像一个非常结构化的格式。 awk 会很好,或者只是在 python 中做。一旦你在 csv 中得到它,你就可以使用 LOAD DATA INFILE 轻松地将它加载到 mysql 中
  • 从您的示例中,每行似乎都包含固定长度的字段。是这样吗,你可以只在每一行上使用 substr() 或 unpack() 吗?我同意虽然 w/beerbajay,但如果文件很大,请转换为 csv。如果没有,只需逐条插入记录。使用 python、perl 等等...

标签: mysql sql csv etl


【解决方案1】:

当您使用 Windows 时,我已将 awk 和 sed 内容重新设计为可以在 Windows 上为您运行而无需它们的东西。直到今天,我还没有写过一行 VBScript,所以可能还有其他更简单的方法:

'###############################################################################
' File: process.vbs
' Author: Mark Setchell
'
' VBScript to process companies file.
'
' Use as follows:
' cscript /nologo process.vbs < file
' 
' Or, to save to an output file, use as follows:
' cscript /nologo process.vbs < file > results.txt
'###############################################################################
Dim rxp, inp
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
Do While Not WScript.StdIn.AtEndOfStream
   inp  = WScript.StdIn.ReadLine()

   ' Regular expression to match any upper case letter
   rxp.Pattern="[A-Z]"

   ' If there are any letters on the input line
   if rxp.Test(inp) Then
      ' Replace multiple spaces with a single comma
      rxp.Pattern="  +"
      inp = rxp.Replace(inp, ",")
      ' Remove leading and trailing commas off line
      rxp.Pattern="^,|,$"
      WScript.StdOut.Write rxp.Replace(inp, "")
   Else
      ' Write a blank line since there was nothing on input line
      WScript.StdOut.WriteBlankLines(1)
   End If
Loop

【讨论】:

    【解决方案2】:

    好的,我迎接挑战。我不确定你想要输出什么,但我猜 CSV 可以导入任何数据库。这是我所拥有的:

    sed -E 's/[ ][ ]+/,/g' yourfile | awk 'BEGIN{ORS=""}/^$/{print "\n"}{print $0}'
    

    “sed”部分将多个空格转换为逗号以分隔字段,并且希望不会将单个空格转换为逗号。然后“awk”部分将输出记录分隔符设置为空,因此“awk”不输出任何换行符,我可以控制它们。 “^$” 查找空行,当我遇到空行时,我自己在输出中引入了一个换行符,否则它只打印输入行。使用您提供的数据,输出如下所示:

    SUNCOR ET AL MEDHAT 9-17-15-4,0416613,ALBERTA CROWN,753.3M,100/09-17-015-04W4/00,S,543.4M,W,167.6M,MEDICINE HAT,656.8M,DEV (NC),MEDICINE HAT,FISH SCALE ZONE,VERTICAL,NEW,PRODUCTION,GAS,SUNCOR ENERGY INC.,09-17-015-04W4,
    CVE HOUSE 3-23-83-17,0416614,ALBERTA CROWN,536.17M,1AB/03-23-083-17W4/00,N,281.3M,E,686.8M,BONNYVILLE,283.7M,OV (C),HOUSE,MCMURRAY FM,VERTICAL,NEW,OIL SAND EVALUATION,CRUDE BITUMEN,CENOVUS ENERGY INC.,03-23-083-17W4,
    CVE GRANOR 11-27-82-18,0416615,ALBERTA CROWN,554.69M,1AA/11-27-082-18W4/00,S,756.7M,E,677.6M,BONNYVILLE,409.2M,OV (C),GRANOR,GROSMONT FM,VERTICAL,NEW,OIL SAND EVALUATION,CRUDE BITUMEN,CENOVUS ENERGY INC.,11-27-082-18W4,
    SUNCOR ET AL MEDHAT 4-17-15-4,0416616,ALBERTA CROWN,750.9M,100/04-17-015-04W4/00,N,320.1M,E,317.1M,MEDICINE HAT,646.4M,DEV (NC),MEDICINE HAT,FISH SCALE ZONE,VERTICAL,NEW,PRODUCTION,GAS,SUNCOR ENERGY INC.
    

    我想行尾的逗号可以用另一个来清理

    sed -e "s/,$//"
    

    如有必要,放在原始管道的末端。

    我会停在那里,因为我不知道我是否走在正确的轨道上!

    【讨论】:

    • 嗨,马克,我认为你是在正确的轨道上。输出到 csv 实际上非常有用,因为它允许我将每个 txt 转换为我可以检查然后合并到一个文件中的 csv。
    • 嗨,马克,我现在已经安装了 sed 和 awk,并且该命令似乎运行没有错误......但是输出会在哪里?
    • 如果您必须安装 awk 和 sed,我猜您使用的是 Windows,对吗?您需要将我给您的命令中的“yourfile”一词更改为您的数据所在文件的名称。因此,如果您的数据存储在名为“companies.txt”的文本文件中,您将需要启动命令提示符(MS-DOS 窗口)并运行我给您的命令,如下所示:sed -E ....comapnies .txt | awk 'BEGIN.... 输出应该会出现在您的屏幕上并快速滚动过去。如果可行,请再次运行该命令,但在末尾添加“> results.txt”以将结果保存在名为“results.txt”的文件中。
    • 显然我们不应该在这里聊天,所以如果你遇到困难,只需在 thesetchells.com 上给我发电子邮件
    猜你喜欢
    • 2020-02-08
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多