我正在使用大型json文件(~100,000行),需要将其压缩以使程序运行得更快。我希望删除所有水平制表符,返回等,以最小化文件的大小。
例如,如果最初是一行:
"name_id": "Richard Feynman",
"occupation": "Professional Bongos Player"
应压缩为:
"name_id":"Richard Feynman","occupation":"Professional Bongos Player"`
我已经浏览了互联网(请原谅我,如果这是一个简单的答案,我是初学者)并且似乎无法找到终端的命令,这将帮助我做到这一点。任何帮助将不胜感激
答案 0 :(得分:11)
看起来你正在寻找一个JSON minifier 。
周围有一些online和standalone。
尝试使用Google搜索这些字词+您喜欢的语言,我相信您会找到适合您需求的内容。
有other tools修改你的JSON以使它更小,但我猜你最终会得到一个不同的JSON。没试过那些。
答案 1 :(得分:1)
使用GNU awk进行RT:
$ awk 'BEGIN{RS="\""} NR%2{gsub(/[[:space:]]/,"")} {ORS=RT;print} END{printf "\n"}' file
"name_id":"Richard Feynman","occupation":"Professional Bongos Player"
答案 2 :(得分:0)
以下flex(1)程序将完成工作。它构成了json源的词法分析,并消除了令牌之间的注释和空格,尊重了字符串空间。它还识别不带引号的标识符,并引用它们。
要编译它,只需执行
make json
使用以下命令:
json [ file ... ]
如果您未指定文件,该程序将从stdin
读取。
这是来源:
%{
/* json-min. JSON minimizer.
* Author: Luis Colorado <lc@luiscoloradosistemas.com>
* Date: Wed Aug 13 07:35:23 EEST 2014
* Disclaimer: This program is GPL, as of GPL version 3, you
* may have received a copy of that document, or you can
* instead look at http://www.gnu.org/licenses/gpl.txt to read
* it. There's no warranty, nor assumed nor implicit on the
* use of this program, you receive it `as is' so whatever you
* do with it is only your responsibility. Luis Colorado
* won't assume any responsibility of the use or misuse of
* this program. You are warned.
*/
%}
dec ([1-9][0-9]*)
oct (0[0-7]*)
hex (0[xX][0-9a-fA-F]*)
doub ({dec}"."([0-9]*)?|{dec}?"."[0-9]+)
strd (\"([^\"]|\\.)*\")
t "true"
f "false"
n "null"
com1 "//".*
com2b "/*"
endc "*/"
ident ([a-zA-Z_][a-zA-Z0-9_]*)
%x INCOMMENT
%option noyywrap
%%
{dec} |
{oct} |
{hex} |
{doub} |
{strd} |
{t} |
{f} |
{n} |
"{" |
":" |
";" |
"}" |
"[" |
"]" |
"," ECHO;
[\ \t\n] |
{com1} ;
{com2b} BEGIN(INCOMMENT);
<INCOMMENT>. ;
<INCOMMENT>{endc} BEGIN(INITIAL);
{ident} { fprintf(stderr, "WARNING:"
"unquoted identifier %s "
"in source. Quoting.\n",
yytext);
printf("\"%s\"", yytext);
}
. { fprintf(stderr,
"WARNING: unknown symbol %s "
"in source, copied to output\n",
yytext);
ECHO;
}
%%
void process(const char *fn);
int main(int argc, const char **argv)
{
int i;
if (argc > 1) for (i = 1; i < argc; i++)
process(argv[i]);
else process(NULL); /* <-- stdin */
} /* main */
void process(const char *fn)
{
FILE *f = stdin;
if (fn) {
f = fopen(fn, "r");
if (!f) {
fprintf(stderr,
"ERROR:fopen:%s:%s(errno=%d)\n",
fn, strerror(errno), errno);
exit(EXIT_FAILURE);
} /* if */
} /* if */
yyin = f;
yylex();
if (fn) /* only close if we opened, don't close stdin. */
fclose(f);
printf("\n");
}
我刚刚写完了,所以几乎没有测试过。小心使用(保存原始文件的备份)它不会覆盖原始文件,只会输出到stdout,因此您不会使用它覆盖数据。
BR, 路易斯