【问题标题】:MySQL: wiered chopping for string when using "SELECT INTO OUTFILE"MySQL:使用“SELECT INTO OUTFILE”时对字符串进行wiered chopping
【发布时间】:2019-09-29 03:14:15
【问题描述】:

我使用以下方法从数据库中导出了两个字段:nameheader

SELECT name, header 
INTO OUTFILE '/var/lib/mysql-files/myfile.txt'
FIELDS TERMINATED BY '<xx>' 
LINES TERMINATED BY '\n'
FROM mytable;

一条记录有这个header 值:

{'Date': 'Fri, 19 Apr 2019 07:23:14 GMT', 'Server': 'Apache', 'Vary': 'Qualys-Scan'、'Strict-Transport-Security': 'max-age=31536000;includeSubDomains;preload', 'Set-Cookie': 'ASP.NET_SessionId=ivoa5bhet0s2ygkylmimvkie;路径=/;安全的; HttpOnly;SameSite=严格, SC_ANALYTICS_GLOBAL_COOKIE=12f133ea5080403692b4ce458fd1a540; 到期=格林威治标准时间 2029 年 4 月 19 日星期四 07:23:14;路径=/;安全的; HttpOnly;SameSite=严格, SC_ANALYTICS_SESSION_COOKIE=336B597E7A534D6393C57DF11E047484|1|ivoa5bhet0s2ygkylmimvkie; 路径=/;安全的; HttpOnly;SameSite=严格, incap_ses_885_270026=cDp/VlO1AHgshF9F6SZIDGJ3uVwAAAAAg7DwpecyehBCyhXgoYO5GA==; 路径=/;域=.zurich.co.uk,___utmvmykuNyVY=dlNaoEsuXSO;路径=/; 最大年龄=900,___utmvaykuNyVY=nWJx01KvGT;路径=/;最大年龄=900, ___utmvbykuNyVY=JZy XEtOwalQ:PtR;路径=/; Max-Age=900', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1;模式=块','缓存控制': '私人','内容类型':'文本/ html;字符集=utf-8','保持活动': 'timeout=5, max=10', 'Connection': 'Keep-Alive', 'X-Iinfo': '8-3925806-3925807 NNNN CT(73 151 0) RT(1555658593583 5) q(0 0 3 0) r(6 6) U5','X-CDN':'封装','内容编码':'gzip', “传输编码”:“分块”}

导出为:

https://z.co.uk&lt;xx&gt;{'Date': 'Fri, 19 Apr 2019 07:23:14 GMT', '服务器':'Apache','Vary':'Qualys-Scan', “严格的运输安全”: 'max-age=31536000;includeSubDomains;preload', 'Set-Cookie': 'ASP.NET_SessionId=ivoa5bhet0s2ygkylmimvkie;路径=/;安全的; HttpOnly;SameSite=严格, SC_ANALYTICS_GLOBAL_COOKIE=12f133ea5080403692b4ce458fd1a540; 到期=格林威治标准时间 2029 年 4 月 19 日星期四 07:23:14;路径=/;安全的; HttpOnly;SameSite=严格, SC_ANALYTICS_SESSION_COOKIE=336B597E7A534D6393C57DF11E047484|1|ivoa5bhet0s2ygkylmimvkie; 路径=/;安全的; HttpOnly;SameSite=严格, incap_ses_885_270026=cDp/VlO1AHgshF9F6SZIDGJ3uVwAAAAAg7DwpecyehBCyhXgoYO5GA==; 路径=/;域=.zurich.co.uk,___utmvmykuNyVY=dlNaoEsuXSO;路径=/; 最大年龄=900,__utmvaykuNyVY=nWJx01KvGT;路径=/;最大年龄=900, ___utmvbykuNyVY=JZy

并在新行中(请注意,它以选项卡开头,这就是堆栈溢出将其显示为代码的原因):

XEtOwalQ: PtR; path=/; Max-Age=900', 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Cache-Control':

'private', 'Content-Type': 'text/html;字符集=utf-8','保持活动': 'timeout=5, max=10', 'Connection': 'Keep-Alive', 'X-Iinfo': '8-3925806-3925807 NNNN CT(73 151 0) RT(1555658593583 5) q(0 0 3 0) r(6 6) U5','X-CDN':'封装','内容编码':'gzip', “传输编码”:“分块”}

为什么会这样?如何避免这种情况?

这给我带来了很大的问题,并出现在许多其他记录中(但不是全部)。

我需要使用 python 读取文件行,python 将截断的行识别为两行而不是一行,这使得这些行不符合我使用 python 处理的行格式,并且我收到错误消息out of index .

【问题讨论】:

  • 也许你在那个地方真的有行尾\n
  • 如何忽略\n,只考虑以}结尾的结束行
  • 在文件中,\n 字符始终被视为行尾。如果对你来说不是很重要,你可以用REPLACE语句将\n替换为空格或本列中的内容。
  • 我更喜欢导出到文件后替换。知道如何在 Linux 中执行此操作吗?

标签: python mysql database mysql-workbench select-into-outfile


【解决方案1】:

类似这样的东西(未测试):

with open('/var/lib/mysql-files/myfile.txt') as f:
    lines = f.read().splitlines()
i = 0
lines2 = []
while i<len(lines):
    if ('{' in lines[i]) and ('}' not in lines[i]):
        l = lines[i] + ' ' + lines[i+1] + '\n'
        i += 1
    else:
        l = lines[i] + '\n'
    lines2.append(l)
    i += 1

with open('/var/lib/mysql-files/fixed.txt', 'w') as f:
    f.writelines(lines2)

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2011-08-01
    • 1970-01-01
    • 2012-02-26
    • 2010-11-05
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多