我有一个包含一些常见字段的时间表数据库表.
id, client_id, project_id, task_id, description, time, date
Run Code Online (Sandbox Code Playgroud)
还有更多,但这就是它的要点.
我在该表上运行导出过夜的CSV文件,以便为用户提供其数据的备份.它还用作带有一些自定义报告的宏Excel文件的数据导入.
这一切都与我一起使用php循环遍历时间表并将行打印到文件.
问题在于大型数据库可能需要数小时才能运行,这是不可接受的.所以我用MySQL INTO OUTFILE命令重新编写它,它将它减少到几秒钟才能运行,这很棒.
现在的问题是我似乎无法在描述字段中转义所有新行字符等.实际上,用户可以在此输入任何字符组合,包括回车/新行.
这是我的MySQL代码的片段:
SELECT id,
client,
project,
task,
REPLACE(REPLACE(ifnull(ts.description,''),'\n',' '),'\r',' ') AS description,
time,
date
INTO OUTFILE '/path/to/file.csv'
FIELDS ESCAPED BY '""'
TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM ....
Run Code Online (Sandbox Code Playgroud)
但...
当我尝试查看输出文件的来源时,文件中仍然存在换行符,因此Excel的CSV导入会破坏Excel向导创建的所有奇特的宏和数据透视表.
关于最佳行动方案的任何想法?
MySQL太棒了!我目前正在参与主要的服务器迁移,之前,我们的小型数据库曾经与客户端托管在同一台服务器上.
所以我们习惯这样做:SELECT * INTO OUTFILE .... LOAD DATA INFILE ....
现在,我们将数据库移动到另一台服务器,SELECT * INTO OUTFILE ....不再有效,可以理解 - 我相信安全原因.但是,有趣的LOAD DATA INFILE ....是可以改为LOAD DATA LOCAL INFILE ....和bam,它有效.
我不是抱怨,也不是我对MySQL的厌恶.替代方案增加了2行额外代码和系统调用形成.sql脚本.所有我想知道的是为什么LOAD DATA LOCAL INFILE有效,为什么没有这样的东西SELECT INTO OUTFILE LOCAL?
我完成了我的作业,找不到上述问题的直接答案.我找不到@MySQL的功能请求.如果有人能够清除它,那就太棒了!
MariaDB能够处理这个问题吗?
我可以根据MySQL查询从phpMyAdmin生成CSV文件吗?
例如,假设我查询了一个表以返回单词"image"的结果.我可以生成一个包含"image"一词的所有记录的CSV吗?
我正在尝试使用mysql命令行工具以逗号分隔格式输出查询结果.我的mysql用户无权使用此问题中引用的"INTO OUTFILE"选项:
我也知道分别在html和xml中格式化输出的-H和-X选项,但是没有办法直接将csv格式输出到屏幕上吗?
我发现这个方法使用sed - http://tlug.dnho.net/?q=node/209.但是,我很想找到一个直接的mysql解决方案.
有任何想法吗?
我想做以下事情 mysql -uuser -ppass -h remote.host.tld database < script.sql
其中script.sql包含以下内容
SELECT *
FROM webrecord_wr25mfz_20101011_175524
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
Run Code Online (Sandbox Code Playgroud)
我希望CSV输出指向标准输出.原因是因为使用an运行此查询INTO OUTFILE 'blah.csv'将保存远程主机上的文件.我希望文件保存在本地主机上.
如果我可以将标准输出重定向到文件,那将是花花公子.
有没有一种简单的方法从命令行运行MySQL查询linux并以csv格式输出结果?
这就是我现在正在做的事情:
mysql -u uid -ppwd -D dbname << EOQ | sed -e 's/ /,/g' | tee
list.csv select id, concat("\"",name,"\"") as name from students EOQ
Run Code Online (Sandbox Code Playgroud)
当有很多列需要用引号括起来,或者结果中有引号需要转义时,它会变得混乱.
我正在尝试将大约 20k 条记录从 mysql 中的一个表导出到 csv,正如预期的那样,它使我的系统崩溃,是否有其他方法可以避免崩溃?
这是我当前的导出代码:
$filename2 = "csv/leads_".date("M-d-Y",time()).".csv";
$fp2 = fopen($filename2, 'w') or die("can't open file");
$sql2 = $sql_getcustomers;
$res2 = mysql_query($sql2);
// fetch a row and write the column names out to the file
$row2 = mysql_fetch_assoc($res2);
$line = "";
$comma = "";
if($row2){
foreach($row2 as $name => $value) {
$line .= $comma . '"' . str_replace('"', '""', $name) . '"';
$comma = ",";
}
$line .= ",crm_group";
$line .= "\n";
fwrite($fp2, $line);
// remove the result …Run Code Online (Sandbox Code Playgroud) 我有一些TSV文件,我需要转换为CSV文件.BASH中是否有任何解决方案,例如使用awk,转换这些?我可以sed像这样使用,但我担心它会犯一些错误:
sed 's/\t/,/g' file.tsv > file.csv
Run Code Online (Sandbox Code Playgroud)
如何将TSV转换为CSV?
世界另一端的一位同事以文本格式向我发送了 MySQL CLI 客户端查询的一些输出。她无法为我将其转换为 CSV,也无法使用INTO OUTFILE输出标志直接输出为 CSV。如何将其转换为 CSV 格式?它看起来像这样:
+-------------+------------------+------------------------------------------+-------------+
| pet_id | pet_identity_id | identity_value | pet_species |
+-------------+------------------+------------------------------------------+-------------+
| 77626 | 3140819 | dominic_dog@example.com | dog |
| 77625 | 3140818 | missy_miauw@example.com | cat |
| 77622 | 3140815 | shelly@example.com | aardvark |
| 77583 | 3140776 | monster_moo@example.com | cow |
+-------------+------------------+------------------------------------------+-------------+
4 rows in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样的 CSV 格式(管道或逗号分隔):
"pet_id"|"pet_identity_id"|"identity_value"|"pet_species"
77626|3140819|"dominic_dog@example.com"|"dog"
77625|3140818|"missy_miauw@example.com"|"cat"
77622|3140815|"shelly@example.com"|"aardvark"
77583|3140776|"monster_moo@example.com"|"cow"
Run Code Online (Sandbox Code Playgroud)
我发现了各种问题,可以让您使用符号在 CLI 客户端中执行此操作INTO OUTFILE,但没有什么可以仅将某人发送给您的查询示例转换为您在 MySQL …
我该怎么做呢:
mysql -u myuser -p mydb -e "select f1,f2 from mytable" > /tmp/mydata.txt
Run Code Online (Sandbox Code Playgroud)
但我想用逗号分隔字段.
mysql --delimiter=, -u myuser -p mydb -e "select f1,f2 from mytable" > /tmp/mydata.txt
Run Code Online (Sandbox Code Playgroud)
不起作用:(
所以我的应用程序导出了一个11.5 MB的CSV文件,并且基本上使用了所有永远不会被释放的RAM.
CSV的数据来自数据库,在上面提到的情况下,整个数据都被导出.
我以下列方式使用Ruby 2.4.1标准CSV库:
export_helper.rb:
CSV.open('full_report.csv', 'wb', encoding: UTF-8) do |file|
data = Model.scope1(param).scope2(param).includes(:model1, :model2)
data.each do |item|
file << [
item.method1,
item.method2,
item.methid3
]
end
# repeat for other models - approx. 5 other similar loops
end
Run Code Online (Sandbox Code Playgroud)
然后在控制器中:
generator = ExportHelper::ReportGenerator.new
generator.full_report
respond_to do |format|
format.csv do
send_file(
"#{Rails.root}/full_report.csv",
filename: 'full_report.csv',
type: :csv,
disposition: :attachment
)
end
end
Run Code Online (Sandbox Code Playgroud)
在一次请求之后,puma进程加载了整个服务器RAM的55%并保持这样,直到最终完全耗尽内存.
例如,在本文中,生成一百万行75 MB CSV文件只需要1 MB RAM.但是没有涉及DB查询.
服务器有1015 MB RAM + 400 MB交换内存.
所以我的问题是:
提前致谢!
mysql ×8
csv ×7
sql ×5
into-outfile ×3
awk ×1
bash ×1
converters ×1
excel ×1
export ×1
mariadb ×1
php ×1
phpmyadmin ×1
sed ×1
tsv ×1