Это было давно, но я столкнулся с такой же проблемой. И нашел здесь много интересных ответов. Поэтому я смутил, какой метод использовать.
В случае добавления большого количества строк в dataframe мне интересна скорость. Итак, я пробовал 3 самых популярных метода и проверял их скорость.
Результаты (в секундах):
Adding 1000 rows 5000 rows 10000 rows
.append 1.04 4.84 9.56
.loc 1.16 5.59 11.50
dict 0.23 0.26 0.34
Поэтому я использую дополнение через словарь для себя.
Код :
import pandas
import numpy
import time
numOfRows = 10000
startTime = time.perf_counter()
df1 = pandas.DataFrame(numpy.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
df1 = df1.append( dict( (a,numpy.random.randint(100)) for a in ['A','B','C','D','E']), ignore_index=True)
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
startTime = time.perf_counter()
df2 = pandas.DataFrame(numpy.random.randint(100, size=(5,5)), columns=['A', 'B', 'C', 'D', 'E'])
for i in range( 1,numOfRows):
df2.loc[df2.index.max()+1] = numpy.random.randint(100, size=(1,5))[0]
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
startTime = time.perf_counter()
row_list = []
for i in range (0,5):
row_list.append(dict( (a,numpy.random.randint(100)) for a in ['A','B','C','D','E']))
for i in range( 1,numOfRows):
dict1 = dict( (a,numpy.random.randint(100)) for a in ['A','B','C','D','E'])
row_list.append(dict1)
df3 = pandas.DataFrame(row_list, columns=['A','B','C','D','E'])
print('Elapsed time: {:6.3f} seconds for {:d} rows'.format(time.perf_counter() - startTime, numOfRows))
PS Я считаю, что моя реализация не идеальна, и, возможно, есть какая-то оптимизация.
Предупреждения о вышесказанном корпусе действительны, но вы сказали, что они не применяются к вашему прецеденту.
Мне интересно, почему вы не можете просто использовать что-то вроде этого?
<?php
$fields = array(
"field 1","field 2","field3hasNoSpaces"
);
fputs(STDOUT, implode($fields, ',')."\n");
Я использую сложный способ удалить двойную кавычку, но только в Linux
....
fputcsv($fp, $product_data,"\t");
....
shell_exec('sed -i \'s/"//g\' /path/to/your-file.txt ');
Не работает ли это?
fputcsv($fp, split(',', $line),',',' ');
Выяснил это. Передавая в ascii-код для Null функции car()
, он работает нормально.
fputcsv($f, $array, $delimiter, car(0))
Спасибо за ответы всем !!!
Это то, что я использую для добавления стандартного CSV в массив ...
function csv_explode($delim=',', $str, $enclose='"', $preserve=false){
$resArr = array();
$n = 0;
$expEncArr = explode($enclose, $str);
foreach($expEncArr as $EncItem){
if($n++%2){
array_push($resArr, array_pop($resArr) . ($preserve?$enclose:'') . $EncItem.($preserve?$enclose:''));
}else{
$expDelArr = explode($delim, $EncItem);
array_push($resArr, array_pop($resArr) . array_shift($expDelArr));
$resArr = array_merge($resArr, $expDelArr);
}
}
return $resArr;
}
Затем вы можете выводить все, что хотите, в цикле foreach.
Недостаток файла CSV без вложений означает, что ошибочная запятая в пользовательском вводе будет забивать строку. Поэтому вам нужно удалить запятые перед написанием строки CSV.
Сложная часть обработки CSV - это разбор приложений, что делает PHP и amp; Функции PEAR CSV ценны. По сути, вы ищете файл с разделителями-запятыми для столбцов и строки с разделителями строк для строк. Вот простая отправная точка:
<?php
$col_separator= ',';
$row_separator= "\n";
$a= array(
array('my', 'values', 'are', 'awes,breakit,ome'),
array('these', 'values', 'also', "rock\nAND\nROLL")
);
function encodeRow(array $a) {
global $col_separator;
global $row_separator;
// Can't have the separators in the column data!
$a2= array();
foreach ($a as $v) {
$a2[]= str_replace(array($col_separator, $row_separator), '', $v);
}
return implode($col_separator, $a2);
}
$output= array();
foreach ($a as $row) {
$output[]= encodeRow($row);
}
echo(implode($row_separator, $output));
?>
работает с функцией chr ():
fputcsv($f,$array,',',chr(0));
"\0"
. В основном невидимый, пока он не вернется, чтобы укусить вас.
– Jon Surrell
11 March 2015 в 16:12
chr(0)
также работал для меня:
fputcsv($fp, $aLine, $sDelimiter, chr(0));
<?php
$filename = "sample.csv";
$handle = fopen($filename, 'w+');
fputcsv($handle, ['column 1','column 2']);
$data = ['sample','data'];
fputs($handle, implode($data,',')."\n");
// or
fwrite($handle, implode($data,',')."\n");
fclose($handle);
$headers = array(
'Content-Type' => 'text/csv',
);
,
в вашем случае). – jgomo3 8 February 2016 в 23:43implode(string $glue, array $pieces)
, чтобы избежать путаницы с людьми, которые являются новыми для PHP и не знают эту функцию PHP & quot; обратных аргументов. – hrvoj3e 16 December 2016 в 12:25