【问题标题】:Automatically convert fixed length strings into delimited strings自动将固定长度字符串转换为分隔字符串
【发布时间】:2015-11-20 00:33:51
【问题描述】:

我有很多文件包含这样的行:

  1. HUIHOJ OPKKA LK
  2. ASOIJS AISJJ PL
  3. AOSKSI 阿西吉德亚

我想将这些行转换成这样的:

  1. HUI;HOJ ;OPKKA ;L;K
  2. ASO;IJS ;AISJJ ;P;L
  3. AOS;KSI ;ASIJD ;Y;A

所以第一个字段是 3 个字符,第二个是 4 个字符,第三个是 6 个字符,第四个是 1 个字符,第五个是 1 个字符。

我知道可以用excel手动完成,但我需要有自动转换的解决方案,因为我有很多结构完全相同的文件。

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    VBA 有一个简单的命令来格式化文本,所以你可以很容易地做到这一点,只需要一行代码

    Function SpFmt(S As String) As String
        SpFmt = Format(S, "@@@\;@@@@\;@@@@@@\;@\;@")
    End Function
    

    如果您想使用工作表函数,可以在工作表上使用嵌套替换公式:

    =REPLACE(REPLACE(REPLACE(REPLACE(A1,4,0,";"),9,0,";"),16,0,";"),18,0,";")
    

    【讨论】:

    • 有趣 - 我没有意识到你可以使用 REPLACE 来插入这样的字符串,使用 '0' 作为被替换的长度。
    【解决方案2】:

    在空格上拆分 (Split function) 后使用 VBA Join Function,或简单地将所有空格替换为 (Replace functoin) 空格和分号。

    dim str as string
    
    str = range("A1").value2   'HUIHOJ OPKKA LK
    range("A1") = Join(Split(str, char(32)), chr(32) & chr(59))  'HUIHOJ ;OPKKA ;LK
    
    str = range("A1").value2   'HUIHOJ OPKKA LK
    range("A1") = Replace(str, chr(32), chr(32) & chr(59))  'HUIHOJ ;OPKKA ;LK
    

    【讨论】:

      【解决方案3】:

      如果您不受 Excel 的限制,您可以使用 unix 工具(也称为 available for Windows)只需一个命令即可非常高效地完成此操作:

      cut --output-delimiter=";" -c 1-3,4-7,8-13,14,15 fixed.txt > delimited.csv
      

      循环中的相同命令:

      for f in *.txt ; do
        cut --output-delimiter=";" -c 1-3,4-7,8-13,14,15 "${f}" > "${f}.csv"
      done
      

      编辑:输出分隔符选项似乎不适用于每个平台。

      或者,您可以使用sed

      sed "s/^\(.\{3\}\)\(.\{4\}\)\(.\{6\}\)\(.\)\(.\)/\1;\2;\3;\4;\5/" fixed.txt > delimited.csv
      

      【讨论】:

      • 谢谢!我在osx上,它会很完美。我在一个名为fixed.txt的文件上尝试了你的命令,但我收到一个错误:“cut:非法选项--用法:cut -b list [-n] [file ...] cut -c list [file .. .] cut -f list [-s] [-d delim] [file ...]"
      • 好的,osx 版本的 cut 可能与 Linux 上的选项略有不同。它似乎不支持 --output-delimiter 选项。你应该参考Apple documentation
      • 同样的问题:stackoverflow.com/questions/20195728/…。您可能需要替换默认输出分隔符。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2010-10-19
      相关资源
      最近更新 更多