【问题标题】:Space Formatting data to csv空间格式化数据到csv
【发布时间】:2014-03-04 16:49:30
【问题描述】:

很长一段时间以来,我一直在尝试将空格分隔的数据格式化为 CSV 结构。

初始位置

初始数据表由下式给出:

Dr. Arun Raykar MBBS, MS - ENT 9 years experience Ear-Nose-Throat (ENT) Specialist SHAKTHI E.N.T CARE    Malleswaram, Bangalore INR 250 MON-SAT7:00PM-9:00PM Book Appointment   
Dr. Hema Sanath C BHMS, CFN 0 years experience Homeopath Sankirana Homeopathic Clinic    Kalyan Nagar, Bangalore INR 250 MON-SAT10:00AM-2:00PM6:30PM-8:00PM Book Appointment   
Dr. Hema Ahuja BDS,M Phil 33 years experience Dentist V2 E City Family Dental Center     Electronics City, Bangalore INR 200 MON-SUN10:00AM-8:00PM Book Appointment

它包含大量的空格和不必要的信息。信息的呈现方式有点像这样

Doctor's name | Degree | Years of experience | Specialization | Hospital name | Address | Fees | Schedule | and an unnecessary book appointment field.

我想转换成如下格式

Doctor's name,Specialization,Hospital name,Address,Fees,Schedule

所以当前数据应该是这样的

 Dr. Arun Raykar,Ear-Nose-Throat (ENT) Specialist,SHAKTHI E.N.T CARE,Malleswaram,INR 250,MON-SAT7:00PM-9:00PM
 Dr. Hema Sanath,Homeopath,Sankirana Homeopathic Clinic,Kalyan Nagar,INR 250,MON-SAT10:00AM-2:00PM6:30PM-8:00PM   
 Dr. Hema Ahuja,Dentist,V2 E City Family Dental Center,Electronics City,INR 200,MON-SUN10:00AM-8:00PM

到目前为止,我已经成功删除了 Book Appointment 字段。

问题

但是,我在对医院名称进行分类时遇到了困难。由于它的间距变化很大。这个问题可行吗?

编辑

cat -A file 的输出如下:

 Dr. Arun Raykar MBBS, MS - ENT 9 years experience Ear-Nose-Throat (ENT) Specialist SHAKTHI E.N.T CARE ^I Malleswaram, Bangalore INR 250 MON-SAT7:00PM-9:00PM Book Appointment $
 Dr. Hema Sanath C BHMS, CFN 0 years experience Homeopath Sankirana Homeopathic Clinic ^I Kalyan Nagar, Bangalore INR 250 MON-SAT10:00AM-2:00PM6:30PM-8:00PM Book Appointment $
 Dr. Hema Ahuja BDS,M Phil 33 years experience Dentist V2 E City Family Dental Center ^I Electronics City, Bangalore INR 200 MON-SUN10:00AM-8:00PM Book Appointment

【问题讨论】:

  • 您的原始文件中似乎有一些tabs,您能否运行命令cat -A file 并将输出更新给我们?
  • 我在 EDIT 部分添加了 cat -A 的输出
  • 有什么方法可以在专业和医院名称之间进行某种分离?
  • 水平制表符是另一种常用的值分隔符。逗号字符不是唯一用于分隔值的字符。我现在问自己,您是否已通过用空格替换制表符来删除分隔符,这样可以很容易地将制表符分隔的 CSV 文件重新格式化为逗号分隔的 CSV 文件,并按您想要的顺序使用您想要的数据。
  • 可以使用 Excel 的Import Text Wizard 将使用制表符作为分隔符的 CSV 文件导入到空白 Microsoft Excel 工作表中。

标签: regex csv awk formatting pretty-print


【解决方案1】:

很遗憾,根据您的输入,无法将专业与医院名称分开。其他字段可以被捕获,尽管不优雅并且使用 gawk(可能 >= 4.0,但我认为 3.x 应该可以工作):

$ awk -F" \t " -v OFS="," -v S=" " '
{
    sub(/\s+$/, "");
    split($2, Data, /[ ,]{2,}/);
    Address  = Data[1];
    split($2, Data, / +/);
    nData    = length(Data);
    Schedule = Data[nData - 2];
    Fees     = Data[nData - 4] S Data[nData - 3];
    split($1, Data, / +/);
    Name     = Data[1] S Data[2] S Data[3]; # assume all names are Dr. Xxx Xxx only
    match($1, /[0-9]+ years experience /);
    SpecializationHospital = substr($1, RSTART + RLENGTH);
    print Name, SpecializationHospital, Address, Fees, Schedule;
} ' data.txt
Dr. Arun Raykar,Ear-Nose-Throat (ENT) Specialist SHAKTHI E.N.T CARE,Malleswaram,INR 250,MON-SAT7:00PM-9:00PM
Dr. Hema Sanath,Homeopath Sankirana Homeopathic Clinic,Kalyan Nagar,INR 250,MON-SAT10:00AM-2:00PM6:30PM-8:00PM
Dr. Hema Ahuja,Dentist V2 E City Family Dental Center,Electronics City,INR 200,MON-SUN10:00AM-8:00PM

【讨论】:

    【解决方案2】:

    没有直接的方法将专业与医院名称分开,但有一些假设,您也许可以使用perl 来做到这一点:

    perl -pe 's/^(\S+\s+\S+\s+\S+).+experience\s([^\t]+?)\s+(\b[A-Z0-9]{2}[^\t]+?|(?:(?!\b[A-Z0-9]{2})[^\t])*)\s+\t\s+([^,]+,).+?(INR.+?PM)\s+.*/\1,\2,\3,\4\5/' file
    

    给予:

    Dr. Arun Raykar,Ear-Nose-Throat (ENT) Specialist,SHAKTHI E.N.T CARE,Malleswaram,INR 250 MON-SAT7:00PM-9:00PM
    Dr. Hema Sanath,Homeopath,Sankirana Homeopathic Clinic,Kalyan Nagar,INR 250 MON-SAT10:00AM-2:00PM6:30PM-8:00PM
    Dr. Hema Ahuja,Dentist,V2 E City Family Dental Center,Electronics City,INR 200 MON-SUN10:00AM-8:00PM
    

    由于它是基于 perl 的正则表达式,您可以使用regex101 来了解它是如何通过正则表达式调试器工作的。正则表达式非常简单,但有很多部分的事实可能会让人望而生畏。

    警告:以上可以根据两件事来区分专业化:

    1. 它尝试查找第一个出现的空格,后跟两个大写字符或数字,并在找到时开始匹配医院名称;或
    2. 如果没有连续的大写字符或数字,则仅将第一个单词作为专业,其余单词作为医院名称。

    我知道它可能无法解决完整的问题,因为总有一些行不符合上述规则,但这可以让您开始清理这些问题。如果有任何不正确的分隔(即专业包含超过 1 个单词并且医院名称没有两个连续的大写/数字),您将正确放置专业的一个单词,其余的放在医院名称中。

    【讨论】:

      猜你喜欢
      • 2021-09-18
      • 1970-01-01
      • 2017-10-01
      • 2018-09-03
      • 2017-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多