2

我有一个很长的 sql 查询,我试图将它放入 VBA for Excel。VBA for Excel 对一行中的文本数量有限制,似乎约为 1000 个字符。我想要做的是将查询复制到文本文件并通过 perl 脚本运行它并输出到文本文件,并将其格式化为 VBA 所需的格式。

我需要 Perl 将字符计数到 1000,然后写入 (" & _) 然后换行符然后 (") 然后重复该过程直到文件末尾。空格或字符类型无关紧要。任何帮助是极大的赞赏。我会经常回来看看是否有人需要更多信息。谢谢!!!

4

2 回答 2

3

单线:

 perl -lape 's/(.{1000})(?=.)/$1" &_\n"/g;' < input > output
于 2012-12-27T01:45:39.260 回答
0

如果您的文本已经在字符串中,那么执行此操作的一种方法是:

$string =~ s/(.{1000})/$1" & _\n"/sg;
print '"', $string, '"';

或者,也许更好:

my @chunks = unpack '(A1000)*', $string;
s/\"/""/g, s/\n/" & vbCrLf & _\n"/g for @chunks;  # escape special characters
print '"', join(qq(" & _\n"), @chunks), '"';

如果您正在从文件中读取输入,也可以通过设置输入记录分隔符在不将所有输入读入内存的情况下执行此操作:

{
    local $/ = \1000;  # read input in chunks of 1000 chars
    print '"';
    while ( <> ) {
        s/\"/""/g; s/\n/" & vbCrLf & _\n"/g;  # escape special characters
        print $_, qq(" & _\n");
    }
    print '"';
}

(其中一些方法有时会""在最后一行留下毫无意义的信息——事实上,最后一种方法总是会这样做——但我认为这不应该是一个问题。)

最后,请注意,这些方法都不会对可能出现在输入中的任何特殊字符(如双引号)进行转义。如果您的输入可能包含此类字符,则需要单独处理它们。如果需要,我已经标记了可以插入代码的点。

编辑:我做了一些谷歌搜索,看起来需要在双引号 VBA 字符串中转义的主要字符是双引号(需要加倍)和换行符(没有简单的编码,需要用克鲁格喜欢" & vbCrLf & ")。我已经编辑了上面的代码来实现这种转义。我想,如果想更加确定,也可以使用以下内容转义所有不可打印和非 ASCII 字符:

s/([^\n -~])/sprintf '" & Chr(%d) & "', ord $1/eg

(Ps. 中的反斜杠s/\"/""/g只是为了避免混淆 SO 的语法荧光笔。)

于 2012-12-27T01:47:22.540 回答