Как экспортировать данные в файл .psv в mysql с заголовками таблицы? [Дубликат]

Ну, я хотел бы добавить свои 2 цента здесь.

Я использую общий веб-хостинг, и я много раз занимался этой проблемой, пытался решить ее самостоятельно, но безрезультатно. Наконец, мне удалось решить эту проблему, проверив различные веб-источники и связавшись с моим провайдером хостинга. Мои вопросы: «Как я могу изменить значение php memory_limit в совместном веб-хостинге?», «Как мне изменить значение php upload_max_filesize в совместном веб-хостинге?», «Как мне изменить значение php max_input_vars в общем веб-хостинге?» , «Как изменить значение php max_execution_time в совместном веб-хостинге?», «Как изменить значение php max_input_time в совместном веб-хостинге?» и многое другое, настраивая или изменяя файл php.ini или .htaccess. Я попытался их изменить, но возникли проблемы. Наконец, я связался с моим хостинг-провайдером, и выяснилось, что я установил свой php в native, они изменили его на php 5.6, вот их ответ:

«Ваш PHP был настроен на« native » режим, который означает, что вы не можете переопределить эти значения. Я изменил вас на «5.6», поэтому вам должно быть хорошо идти ».

blockquote>

После этого я подключил свой сайт через ftp Filezilla , также не забудьте сделать так, чтобы ваша служба ftp отображала скрытые файлы и ваш локальный компьютер, потому что файл .htaccess был скрыт в моем локальном ноутбуке и на моем веб-сайте. Он был доступен в папке public_html, я только что загрузил его и добавил следующие коды в конец файла, а затем загрузил его обратно на сервер:

php_value memory_limit 256M
php_value post_max_size 256M
php_value upload_max_filesize 64M
php_value max_input_vars 1800
php_value max_execution_time 300
php_value max_input_time 300

На данный момент все работает правильно, если кто-то из вас справится с некоторыми проблемами, напишите здесь и предоставьте мне, чтобы я мог изменить приведенные выше коды. Кстати, я также загружаю несколько фотографий, которые показывают изменение.

Еще одна вещь, о которой я почти забыл упомянуть об установке ZipArchive в вашем общем сервисе веб-хостинга, мне удалось установить это требование, просто перейдя на php-настройки через мою cpanel, нажмите на расширения селектора php, а затем отметьте zip-раздел, это все.

Спасибо.

PS: Я открыт для хорошей практики, и если вы видите какую-либо плохую практику, пожалуйста, дайте мне знать, я постараюсь изменить их. Спасибо.

85
задан GEOCHET 28 August 2012 в 19:34
поделиться

14 ответов

Вам придется жестко закодировать эти заголовки самостоятельно. Что-то вроде:

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE '/path/outfile'
120
ответ дан Joe Stefanelli 28 August 2018 в 15:12
поделиться

Поскольку функциональность «include-headers» пока еще не встроена, и большинство «решений» здесь нужно вводить имена столбцов вручную и / или даже не принимать во внимание, d рекомендовать, чтобы обойти проблему.

  • Лучшей альтернативой, которую я нашел до сих пор, является использование достойного инструмента (я использую HeidiSQL). Поместите свой запрос, выберите сетку, просто щелкните правой кнопкой мыши и экспортируйте в файл. Он получил все необходимые опции для чистого экспорта, а также должен удовлетворить большинство потребностей.
  • В этой же идее подход user3037511 работает отлично и может быть легко автоматизирован. Просто запустите свой запрос с помощью некоторой командной строки, чтобы получить заголовки. Вы можете получить данные с помощью SELECT INTO OUTFILE ... или выполнив свой запрос без ограничения, ваш выбор. Обратите внимание, что перенаправление вывода в файл работает как прелесть как для Linux, так и для Windows.

Это заставляет меня хотеть выделить это 80% времени, когда я хочу использовать SELECT FROM INFILE или SELECT INTO OUTFILE, я в конечном итоге использую что-то еще из-за некоторых ограничений (здесь, отсутствия «вариантов заголовков», AWS-RDS, отсутствующих прав и т. Д.).

Следовательно , Я точно не отвечаю на вопрос op [...], но он должен ответить на его потребности :) EDIT: и на самом деле ответить на его вопрос: no As от 2017-09-07, вы просто не можете включать заголовки, если вы придерживаетесь команды SELECT INTO OUTFILE : |

1
ответ дан Balmipour 28 August 2018 в 15:12
поделиться

Это позволит вам иметь упорядоченные столбцы и / или предел

SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT * from (SELECT ColName1, ColName2, ColName3
    FROM YourTable order by ColName1 limit 3) a
    INTO OUTFILE '/path/outfile';
5
ответ дан Donald Wagner 28 August 2018 в 15:12
поделиться

Для сложного выбора с ORDER BY я использую следующее:

SELECT * FROM (
    SELECT 'Column name #1', 'Column name #2', 'Column name ##'
    UNION ALL
    (
        // complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
    )
) resulting_set
INTO OUTFILE '/path/to/file';
11
ответ дан evilguc 28 August 2018 в 15:12
поделиться

Решение, предоставленное Джо Стеанелли, работает, но составление списка столбцов неудобно, когда задействованы десятки или сотни столбцов. Вот как получить столбец таблицы my_table в my_schema.

-- override GROUP_CONCAT limit of 1024 characters to avoid a truncated result
set session group_concat_max_len = 1000000;

select GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'"))
from INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'my_table'
AND TABLE_SCHEMA = 'my_schema'
order BY ORDINAL_POSITION

Теперь вы можете копировать & amp; вставьте полученную строку в качестве первого оператора в методе Джо.

71
ответ дан Jerome Jaglale 28 August 2018 в 15:12
поделиться

Это альтернативный чит, если вы знакомы с Python или R, и ваша таблица может вписаться в память.

Импортировать таблицу SQL в Python или R, а затем экспортировать из нее в виде CSV, и вы получите имена столбцов, а также данные.

Вот как я это делаю, используя R, требуется библиотека RMySQL:

db <- dbConnect(MySQL(), user='user', password='password', dbname='myschema', host='localhost')

query <- dbSendQuery(db, "select * from mytable")
dataset <- fetch(query, n=-1)

write.csv(dataset, 'mytable_backup.csv')

Это немного обман, но я обнаружил, что это было быстрым способом, когда число столбцов было слишком длинным, чтобы использовать метод concat выше. Примечание: R добавит столбец «row.names» в начале CSV, поэтому вам нужно отказаться от него, если вам нужно полагаться на CSV, чтобы воссоздать таблицу.

3
ответ дан Joining Dots 28 August 2018 в 15:12
поделиться
SELECT 'ColName1', 'ColName2', 'ColName3'
UNION ALL
SELECT ColName1, ColName2, ColName3
    FROM YourTable
    INTO OUTFILE 'c:\\datasheet.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' 
-2
ответ дан manoj singh 28 August 2018 в 15:12
поделиться

Я думаю, что если вы используете UNION, он будет работать:

select 'header 1', 'header 2', ...
union
select col1, col2, ... from ...

Я не знаю, как напрямую указать заголовки с синтаксисом INTO OUTFILE.

0
ответ дан Paul W 28 August 2018 в 15:12
поделиться

Ниже приведен способ получения заголовков заголовков из имен столбцов динамически.

/* Change table_name and database_name */
SET @table_name = 'table_name';
SET @table_schema = 'database_name';
SET @default_group_concat_max_len = (SELECT @@group_concat_max_len);

/* Sets Group Concat Max Limit larger for tables with a lot of columns */
SET SESSION group_concat_max_len = 1000000;

SET @col_names = (
  SELECT GROUP_CONCAT(QUOTE(`column_name`)) AS columns
  FROM information_schema.columns
  WHERE table_schema = @table_schema
  AND table_name = @table_name);

SET @cols = CONCAT('(SELECT ', @col_names, ')');

SET @query = CONCAT('(SELECT * FROM ', @table_schema, '.', @table_name,
  ' INTO OUTFILE \'/tmp/your_csv_file.csv\'
  FIELDS ENCLOSED BY \'\\\'\' TERMINATED BY \'\t\' ESCAPED BY \'\'
  LINES TERMINATED BY \'\n\')');

/* Concatenates column names to query */
SET @sql = CONCAT(@cols, ' UNION ALL ', @query);

/* Resets Group Contact Max Limit back to original value */
SET SESSION group_concat_max_len = @default_group_concat_max_len;

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
-1
ответ дан RNickMcCandless 28 August 2018 в 15:12
поделиться

На самом деле вы можете заставить его работать даже с ORDER BY.

Просто нужно немного обмануть в инструкции order by - мы используем оператор case и заменяем значение заголовка некоторым другим значением, которое гарантировано сортировать сначала в списке (очевидно, это зависит от типа поля и от того, сортируете ли вы ASC или DESC)

Допустим, у вас есть три поля, имя (varchar), is_active (bool), date_something_happens ( дата), и вы хотите отсортировать второй второй по убыванию:

select 
        'name'
      , 'is_active' as is_active
      , date_something_happens as 'date_something_happens'

 union all

 select name, is_active, date_something_happens

 from
    my_table

 order by
     (case is_active when 'is_active' then 0 else is_active end) desc
   , (case date when 'date' then '9999-12-30' else date end) desc
0
ответ дан Simon Woolf 28 August 2018 в 15:12
поделиться

Итак, , если все столбцы в my_table являются символьным типом данных , мы можем объединить верхние ответы (Joe, matt и evilguc) вместе, чтобы получить заголовок, добавленный автоматически в один «простой» SQL-запрос, например

select * from (
  (select column_name
    from information_schema.columns
    where table_name = 'my_table'
    and table_schema = 'my_schema'
    order by ordinal_position)
  union all
  (select *  // potentially complex SELECT statement with WHERE, ORDER BY, GROUP BY etc.
  from my_table)) as tbl
into outfile '/path/outfile'
fields terminated by ',' optionally enclosed by '"' escaped by '\\'
lines terminated by '\n';

, где последние две строки делают вывод csv.

Обратите внимание, что это может быть медленным, если my_table очень велико.

1
ответ дан TheBamf 28 August 2018 в 15:12
поделиться

Я писал свой код в PHP, и у меня была небольшая проблема с использованием функций concat и union, а также не использовались переменные SQL, так как я получил его для работы, вот мой код:

//first I connected to the information_scheme DB

$headercon=mysqli_connect("localhost", "USERNAME", "PASSWORD", "information_schema");

//took the healders out in a string (I could not get the concat function to work, so I wrote a loop for it)

    $headers = '';
    $sql = "SELECT column_name AS columns FROM `COLUMNS` WHERE table_schema = 'YOUR_DB_NAME' AND table_name = 'YOUR_TABLE_NAME'";
    $result = $headercon->query($sql);
    while($row = $result->fetch_row())
    {
        $headers = $headers . "'" . $row[0] . "', ";
    }
$headers = substr("$headers", 0, -2);

// connect to the DB of interest

$con=mysqli_connect("localhost", "USERNAME", "PASSWORD", "YOUR_DB_NAME");

// export the results to csv
$sql4 = "SELECT $headers UNION SELECT * FROM YOUR_TABLE_NAME WHERE ... INTO OUTFILE '/output.csv' FIELDS TERMINATED BY ','";
$result4 = $con->query($sql4);
0
ответ дан Tunaki 28 August 2018 в 15:12
поделиться

Я просто делаю 2 запроса, сначала получаю вывод запроса (ограничение 1) с именами столбцов (без жесткого кода, без проблем с именами Joins, Order by, пользовательскими именами столбцов и т. д.), а во-вторых, для создания самого запроса и объединения файлов в один файл CSV:

CSVHEAD=`/usr/bin/mysql $CONNECTION_STRING -e "$QUERY limit 1;"|head -n1|xargs|sed -e "s/ /'\;'/g"`
echo "\'$CSVHEAD\'" > $TMP/head.txt
/usr/bin/mysql $CONNECTION_STRING -e "$QUERY into outfile '${TMP}/data.txt' fields terminated by ';' optionally enclosed by '\"' escaped by '' lines terminated by '\r\n';"
cat $TMP/head.txt $TMP/data.txt > $TMP/data.csv
5
ответ дан user3037511 28 August 2018 в 15:12
поделиться

Вы можете использовать подготовленный оператор с ответом lucek и динамически экспортировать таблицу с именем столбцов в CSV:

--If your table has too many columns
SET GLOBAL group_concat_max_len = 100000000;
--Prepared statement
SET @SQL = ( select CONCAT('SELECT * INTO OUTFILE \'YOUR_PATH\' FIELDS TERMINATED BY \',\' OPTIONALLY ENCLOSED BY \'"\' ESCAPED BY \'\' LINES TERMINATED BY \'\\n\' FROM (SELECT ', GROUP_CONCAT(CONCAT("'",COLUMN_NAME,"'")),' UNION select * from YOUR_TABLE) as tmp') from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE' AND TABLE_SCHEMA = 'YOUR_SCHEMA' order BY ORDINAL_POSITION );
--Execute it
PREPARE stmt FROM @SQL;
EXECUTE stmt;

Thank lucek.

4
ответ дан Vrag 28 August 2018 в 15:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: