自动将固定长度的string转换为分隔string

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

  1. HUHOHOJ OPKKA LK
  2. ASOIJS AISJJ PL
  3. AOSKSI ASIJD YA

我想把这些线转换成这样的东西:

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

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

我知道可以用excel手动执行,但我需要自动转换解决scheme,因为我有许多具有完全相同结构的文件。

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

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

如果要使用工作表函数,则可以在工作表上使用嵌套的replace公式进行此操作:

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

在空间分割( 分割函数 )后使用VBA 连接函数 ,或者简单地用空格和分号replace( replacefunctoin )所有空格。

 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 

如果您没有受限于Excel,那么您可以使用unix工具(也可用于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