إجبار FUPPCSV على استخدام العلبة لـ * All * Fields

StackOverflow https://stackoverflow.com/questions/2489553

  •  21-09-2019
  •  | 
  •  

سؤال

عندما أستخدم FPUTCSV لكتابة سطر إلى مقبض ملف مفتوح ، ستضيف PHP حرفًا مغلقًا إلى أي عمود يعتقد أنه يحتاجه ، ولكنه سيترك أعمدة أخرى بدون العبوات.

على سبيل المثال ، قد ينتهي بك الأمر بخط مثل هذا

11,"Bob ",Jenkins,"200 main st. USA ",etc

أقل من إلحاق مساحة زائفة حتى نهاية كل حقل ، هل هناك أي طريقة لإجبار FUPPCSV على إرفاق الأعمدة دائمًا مع الحاوية (الافتراضيات إلى ")؟

هل كانت مفيدة؟

المحلول

لا ، FUPPCSV () لا يحيط بالحقل إلا في ظل الشروط التالية

/* enclose a field that contains a delimiter, an enclosure character, or a newline */
if (FPUTCSV_FLD_CHK(delimiter) ||
  FPUTCSV_FLD_CHK(enclosure) ||
  FPUTCSV_FLD_CHK(escape_char) ||
  FPUTCSV_FLD_CHK('\n') ||
  FPUTCSV_FLD_CHK('\r') ||
  FPUTCSV_FLD_CHK('\t') ||
  FPUTCSV_FLD_CHK(' ')
)

لا يوجد خيار "أرفق دائمًا".

نصائح أخرى

لست سعيدًا بهذا الحل ولكن هذا ما فعلته وعملت. تتمثل الفكرة في تعيين char فارغ كحرف العلبة على FUPTCSV وإضافة بعض الاقتباسات على كل عنصر من عناصر الصفيف الخاص بك.

function encodeFunc($value) {
    return "\"$value\"";
}

fputcsv($handler, array_map(encodeFunc, $array), ',', chr(0));

بناء على مارتنإجابة ، إذا كنت تريد تجنب إدخال أي أحرف لا تنبع من صفيف المصدر (Chr(127), Chr(0), ، إلخ) ، يمكنك استبدال خط FUPCSV () بما يلي بدلاً من ذلك:

fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");

منحت ، fputs () أبطأ من FPUTCSV () ، لكنه ناتج أنظف. الرمز الكامل هكذا:

/***
 * @param $value array
 * @return string array values enclosed in quotes every time.
 */
function encodeFunc($value) {
    ///remove any ESCAPED double quotes within string.
    $value = str_replace('\\"','"',$value);
    //then force escape these same double quotes And Any UNESCAPED Ones.
    $value = str_replace('"','\"',$value);
    //force wrap value in quotes and return
    return '"'.$value.'"';
}

$fp = fopen("filename.csv", 'w');
foreach($table as $row){
    fputs($fp, implode(",", array_map("encodeFunc", $row))."\r\n");
}
fclose($fp);

بعد الكثير من البحث عن شخصيات ممل إلى حد ما ، لدي نسخة من الرموز المشار إليها أعلاه بواسطة دييغو و ماهن سيؤدي ذلك بشكل صحيح إلى تجريد الغواصات واستبدالها مع علامات اقتباس مزدوجة على جميع الحقول في fputcsv. ثم إخراج الملف إلى المستعرض للتنزيل.

لقد واجهت أيضًا مشكلة ثانوية لعدم القدرة على التأكد من أن الاقتباسات المزدوجة كانت دائمًا / لم تنتهك أبدًا.

على وجه التحديد عند الإخراج مباشرة إلى المتصفح باستخدام دفق الإدخال php: // كما هو مشار إليه من قبل دييغو. Chr(127) هو حرف فضاء ، لذا فإن ملف CSV يحتوي على عدد قليل من المساحات أكثر من خلاف ذلك ، لكنني أعتقد أن هذا يتجنب مسألة chr(0) أحرف خالية في UTF-8.

/***
 * @param $value array
 * @return string array values enclosed in quotes every time.
 */
function encodeFunc($value) {
    ///remove any ESCAPED double quotes within string.
    $value = str_replace('\\"','"',$value);
    //then force escape these same double quotes And Any UNESCAPED Ones.
    $value = str_replace('"','\"',$value);
    //force wrap value in quotes and return
    return '"'.$value.'"';
}


$result = $array_Set_Of_DataBase_Results;
$fp = fopen('php://output', 'w');
if ($fp && $result) {
    header('Content-Type: text/csv');
    header('Content-Disposition: attachment; filename="export-'.date("d-m-Y").'.csv"');
    foreach($result as $row) {
        fputcsv($fp, array_map("encodeFunc", $row), ',', chr(127));
    }
    unset($result,$row);
    die;
}

آمل أن يكون هذا مفيدًا لشخص ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top