当我在Mac上使用Excel输出.tsv文件时,压缩它,将其发送到linux机器,并使用unzip命令解压缩,我在文件末尾收到一堆垃圾。在文件中,我有19行数据。我在finder中使用右键菜单中的默认“压缩”功能。我通过PHP上传文件。这是我在zip文件上运行的命令(手动或自动从脚本中运行):
unzip -aajp {zipfile} > {newfile}
当我打开{newfile}时,我在文件的末尾看到了所有这些:
^@^E^V^G^@^B^@^@Mac OS X ^@^B^@^@^@ ^@^@^@2^@^@^@ ^@^@^@^B^@^@^@R^@^@^@^@TEXTXCEL^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
无论如何要摆脱文件末尾的垃圾?
当我跑步时:
unzip -aaj {zipfile}
它将解压缩文件,将其转换为text / plain而不用垃圾就好了。但是在我的PHP脚本中,我需要能够获得文件的确切名称/位置。
我愿意这样做。我似乎无法找到正确的解决方案。话虽这么说,它也需要为来自Windows的文件工作。有什么想法吗?
更新
这是我最终做的事情,但它仍然感到草率。我仍然愿意接受更好的解决方案。
function decompress($filename) {
// generate a temporary filename
$tmpfile = '/tmp/'.mt_rand();
// Here we actually decompress the $working_zip_file file
$command = "unzip -aao $filename -d $tmpfile/ | egrep \"(inflating:|extracting:)\" | grep -v MACOS ";
$unzip_output = exec($command, $dummy, $unzipstatus);
// If things where unzipped properly
if($unzipstatus[0] == 0) {
$work_plain_file = preg_match('/\s*(inflating:|extracting:)(.*)$/', $unzip_output, $matches);
$work_plain_file = trim($matches[2]);
$clean_name = str_replace(' ', '_', $work_plain_file);
if($clean_name != $work_plain_file){
exec("mv \"$work_plain_file\" $clean_name");
$work_plain_file = $clean_name;
}
rename($work_plain_file, $new_file);
}
}
答案 0 :(得分:1)
unzip
是愚蠢的。您必须告诉它忽略它在.DS_Store
中找到的任何内容。