自动将固定长度的字符串转换为分隔的字符串

时间:2015-11-19 09:26:09

标签: excel excel-vba vba

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

  1. HUIHOJ OPKKA LK
  2. ASOIJS AISJJ PL
  3. AOSKSI ASIJD YA
  4. 我想将这些行转换成这样的东西:

    1. HUI; HOJ; OPKKA; L; K
    2. ASO; IJS; AISJJ; P; L
    3. AOS; KSI; ASIJD; Y; ​​A
    4. 所以第一个字段是3个字符,第二个字段是4个字符,第三个字段是6个,第四个字符是第1个字符。

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

3 个答案:

答案 0 :(得分:2)

VBA has a simple command to format text, so you can do this fairly easily, and with just a single line of code

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

If you want to use a worksheet function, you can do this with a nested replace formula on the worksheet:

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

答案 1 :(得分:0)

在空格上拆分(Join Function)后使用VBA Split 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

答案 2 :(得分:0)

如果你没有受到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